From b1dae4bcce8f2c349beb03532b5a5715e2284f50 Mon Sep 17 00:00:00 2001 From: Alex Volkovitsky Date: Mon, 21 Sep 2020 16:17:03 -0700 Subject: [PATCH] Update API to take URI instead of hostname/port --- packages/auth/src/auth.js | 19 ++++---- packages/auth/src/defines.js | 6 +-- packages/auth/src/exports_auth.js | 3 +- packages/auth/src/iframeclient/ifchandler.js | 43 ++++++++++++------- packages/auth/src/rpchandler.js | 7 +-- packages/auth/test/auth_test.js | 29 +++++-------- packages/auth/test/authuser_test.js | 6 +-- .../auth/test/iframeclient/ifchandler_test.js | 6 +-- packages/auth/test/rpchandler_test.js | 6 +-- 9 files changed, 63 insertions(+), 62 deletions(-) diff --git a/packages/auth/src/auth.js b/packages/auth/src/auth.js index 990b819dd26..2a2c18d6e05 100644 --- a/packages/auth/src/auth.js +++ b/packages/auth/src/auth.js @@ -294,15 +294,17 @@ fireauth.Auth.prototype.useDeviceLanguage = function() { /** * Sets the emulator configuration (go/firebase-emulator-connection-api). - * @param {string} hostname The hostname for the Auth emulator. - * @param {number} port The port for the Auth emulator. - */ -fireauth.Auth.prototype.useEmulator = function(hostname, port) { + /** + * Sets the emulator configuration (go/firebase-emulator-connection-api). + * @param {string} url The url for the Auth emulator. + */ +fireauth.Auth.prototype.useEmulator = function(url) { // Don't do anything if no change detected. - if (!this.emulatorConfig_ || - hostname !== this.emulatorConfig_.hostname || - port !== this.emulatorConfig_.port) { - this.emulatorConfig_ = { hostname: hostname, port: port }; + if (!this.emulatorConfig_ || url !== this.emulatorConfig_.url) { + console.warn("WARNING: You are using the Auth Emulator, which is" + + " intended for local testing only. Do not use with" + + " production credentials."); + this.emulatorConfig_ = { url: url }; // Disable app verification. this.settings_().setAppVerificationDisabledForTesting(true); // Update custom Firebase locale field. @@ -875,6 +877,7 @@ fireauth.Auth.prototype.updateCurrentUser = function(user) { options['apiKey'] = this.app_().options['apiKey']; options['authDomain'] = this.app_().options['authDomain']; options['appName'] = this.app_().name; + options['emulatorConfig'] = this.emulatorConfig_; var newUser = fireauth.AuthUser.copyUser(user, options, self.redirectUserStorageManager_, self.getFramework()); return this.registerPendingPromise_( diff --git a/packages/auth/src/defines.js b/packages/auth/src/defines.js index e90fbe65ac3..d7bc309fc56 100644 --- a/packages/auth/src/defines.js +++ b/packages/auth/src/defines.js @@ -172,12 +172,10 @@ fireauth.constants.OIDC_PREFIX = 'oidc.'; /** * The settings of an Auth emulator. The fields are: * * @typedef {{ - * hostname: string, - * port: number + * url: string, * }} */ fireauth.constants.EmulatorSettings; \ No newline at end of file diff --git a/packages/auth/src/exports_auth.js b/packages/auth/src/exports_auth.js index a174ff93dff..9b52bbe96a7 100644 --- a/packages/auth/src/exports_auth.js +++ b/packages/auth/src/exports_auth.js @@ -200,8 +200,7 @@ fireauth.exportlib.exportPrototypeMethods( useEmulator: { name: 'useEmulator', args: [ - fireauth.args.string('hostname'), - fireauth.args.number('port') + fireauth.args.string('url') ] }, verifyPasswordResetCode: { diff --git a/packages/auth/src/iframeclient/ifchandler.js b/packages/auth/src/iframeclient/ifchandler.js index 219d668c13d..39d32e143a1 100644 --- a/packages/auth/src/iframeclient/ifchandler.js +++ b/packages/auth/src/iframeclient/ifchandler.js @@ -82,18 +82,19 @@ fireauth.iframeclient.IframeUrlBuilder = function(authDomain, apiKey, appName, e this.emulatorConfig_ = emulatorConfig; /** @private {?string|undefined} The client version. */ this.v_ = null; - /** - * @private @const {!goog.Uri} The URI object used to build the iframe URL. - */ - this.uri_ = this.emulatorConfig_ ? goog.Uri.create( - 'http', + let uri; + if (this.emulatorConfig_) { + const emulatorUri = goog.Uri.parse(this.emulatorConfig_.url); + uri = goog.Uri.create( + emulatorUri.getScheme(), null, - this.emulatorConfig_.hostname, - this.emulatorConfig_.port, + emulatorUri.getDomain(), + emulatorUri.getPort(), '/emulator/auth/iframe', null, - null) : - goog.Uri.create( + null); + } else { + uri = goog.Uri.create( fireauth.iframeclient.SCHEME, null, this.authDomain_, @@ -101,6 +102,11 @@ fireauth.iframeclient.IframeUrlBuilder = function(authDomain, apiKey, appName, e '/__/auth/iframe', null, null); + } + /** + * @private @const {!goog.Uri} The URI object used to build the iframe URL. + */ + this.uri_ = uri; this.uri_.setParameterValue('apiKey', this.apiKey_); this.uri_.setParameterValue('appName', this.appName_); /** @private {?string|undefined} The endpoint ID. */ @@ -306,16 +312,20 @@ fireauth.iframeclient.OAuthUrlBuilder.prototype.setAdditionalParameters = * @return {string} The constructed OAuth URL string. * @override */ -fireauth.iframeclient.OAuthUrlBuilder.prototype.toString = function() { - var uri = this.emulatorConfig_ ? goog.Uri.create( - 'http', +fireauth.iframeclient.OAuthUrlBuilder.prototype.toString = function () { + var uri; + if (this.emulatorConfig_) { + const emulatorUri = goog.Uri.parse(this.emulatorConfig_.url); + uri = goog.Uri.create( + emulatorUri.getScheme(), null, - this.emulatorConfig_.hostname, - this.emulatorConfig_.port, + emulatorUri.getDomain(), + emulatorUri.getPort(), '/emulator/auth/handler', null, - null) : - goog.Uri.create( + null); + } else { + uri = goog.Uri.create( fireauth.iframeclient.SCHEME, null, this.authDomain_, @@ -323,6 +333,7 @@ fireauth.iframeclient.OAuthUrlBuilder.prototype.toString = function() { '/__/auth/handler', null, null); + } uri.setParameterValue('apiKey', this.apiKey_); uri.setParameterValue('appName', this.appName_); uri.setParameterValue('authType', this.authType_); diff --git a/packages/auth/src/rpchandler.js b/packages/auth/src/rpchandler.js index 35df2347a27..0b6147682ce 100644 --- a/packages/auth/src/rpchandler.js +++ b/packages/auth/src/rpchandler.js @@ -470,10 +470,11 @@ fireauth.RpcHandler.prototype.updateEmulatorConfig = function(emulatorConfig) { */ fireauth.RpcHandler.generateEmululatorEndpointUrl_ = function(endpoint, emulatorConfig) { const uri = goog.Uri.parse(endpoint); - uri.setScheme("http"); + const endpointUri = goog.Uri.parse(emulatorConfig.url); uri.setPath(uri.getDomain() + uri.getPath()); - uri.setDomain(emulatorConfig.hostname); - uri.setPort(emulatorConfig.port); + uri.setScheme(endpointUri.getScheme()); + uri.setDomain(endpointUri.getDomain()); + uri.setPort(endpointUri.getPort()); return uri.toString(); } diff --git a/packages/auth/test/auth_test.js b/packages/auth/test/auth_test.js index 129510e3674..e0264f34df5 100644 --- a/packages/auth/test/auth_test.js +++ b/packages/auth/test/auth_test.js @@ -921,45 +921,40 @@ function testUseEmulator() { 0, fireauth.RpcHandler.prototype.updateEmulatorConfig.getCallCount()); // Update the emulator config. - auth1.useEmulator('emulator.test.domain', 1234); + auth1.useEmulator('http://emulator.test.domain:1234'); assertObjectEquals( auth1.getEmulatorConfig(), { - hostname: 'emulator.test.domain', - port: 1234 + url: 'http://emulator.test.domain:1234', }); // Should notify the RPC handler. assertEquals( 1, fireauth.RpcHandler.prototype.updateEmulatorConfig.getCallCount()); assertObjectEquals({ - hostname: 'emulator.test.domain', - port: 1234 + url: 'http://emulator.test.domain:1234', }, fireauth.RpcHandler.prototype.updateEmulatorConfig.getLastCall() .getArgument(0) ); // Update to the same config should not trigger event again. - auth1.useEmulator('emulator.test.domain', 1234); + auth1.useEmulator('http://emulator.test.domain:1234'); assertObjectEquals( auth1.getEmulatorConfig(), { - hostname: 'emulator.test.domain', - port: 1234 + url: 'http://emulator.test.domain:1234', }); assertEquals( 1, fireauth.RpcHandler.prototype.updateEmulatorConfig.getCallCount()); // Updating to different config should trigger event. - auth1.useEmulator('emulator.other.domain', 9876); + auth1.useEmulator('http://emulator.other.domain:9876'); assertObjectEquals( auth1.getEmulatorConfig(), { - hostname: 'emulator.other.domain', - port: 9876 + url: 'http://emulator.other.domain:9876' }); assertEquals( 2, fireauth.RpcHandler.prototype.updateEmulatorConfig.getCallCount()); assertObjectEquals({ - hostname: 'emulator.other.domain', - port: 9876 + url: 'http://emulator.other.domain:9876', }, fireauth.RpcHandler.prototype.updateEmulatorConfig.getLastCall() .getArgument(0) @@ -2246,21 +2241,19 @@ function testAuth_authEventManager_withEmulator() { assertEquals('API_KEY', apiKey); assertEquals(appId1, appName); assertObjectEquals(emulatorConfig, { - hostname: 'emulator.host', - port: 1234 + url: 'http://emulator.test.domain:1234' }); return expectedManager; }); asyncTestCase.waitForSignals(1); app1 = firebase.initializeApp(config3, appId1); auth1 = app1.auth(); - auth1.useEmulator('emulator.host', 1234); + auth1.useEmulator('http://emulator.test.domain:1234'); // Test manager initialized and Auth subscribed. auth1.onIdTokenChanged(function (user) { var manager = fireauth.AuthEventManager.getManager( config3['authDomain'], config3['apiKey'], app1.name, { - hostname: 'emulator.host', - port: 1234 + url: 'http://emulator.test.domain:1234', }); assertEquals(expectedManager, manager); assertEquals(0, expectedManager.unsubscribe.getCallCount()); diff --git a/packages/auth/test/authuser_test.js b/packages/auth/test/authuser_test.js index 80630293472..f72e9a01f43 100644 --- a/packages/auth/test/authuser_test.js +++ b/packages/auth/test/authuser_test.js @@ -13183,13 +13183,11 @@ function testUser_emulatorConfigChanges() { var dispatcher2 = createEventDispatcher(); user = new fireauth.AuthUser(config1, tokenResponse, accountInfo); var emulatorConfig = { - hostname: 'emulator.test.domain', - port: 1234 + url: 'http://emulator.test.domain:1234', }; var otherEmulatorConfig = { - hostname: 'other.emulator.host', - port: 9876 + url: 'http://other.emulator.host:9876' }; // Set emulator config. diff --git a/packages/auth/test/iframeclient/ifchandler_test.js b/packages/auth/test/iframeclient/ifchandler_test.js index 61abbf7aefe..5b669d4b3bc 100644 --- a/packages/auth/test/iframeclient/ifchandler_test.js +++ b/packages/auth/test/iframeclient/ifchandler_test.js @@ -486,8 +486,7 @@ function testOAuthUrlBuilder_notOAuthProviderInstance() { function testOAuthUrlBuilder_withEmulatorConfig() { var provider = new fireauth.GoogleAuthProvider(); var emulatorConfig = { - hostname: "emulator.host", - port: 1234 + url: "http://emulator.host:1234" }; var builder = new fireauth.iframeclient.OAuthUrlBuilder( 'example.firebaseapp.com', 'API_KEY', 'APP_NAME', 'signInWithPopup', @@ -1513,8 +1512,7 @@ function testGetAuthIframeUrl_withEmulator() { var version = '3.0.0-rc.1'; var endpointId = 's'; var emulatorConfig = { - hostname: "emulator.host", - port: 1234 + url: "http://emulator.host:1234" }; assertEquals( 'http://emulator.host:1234/emulator/auth/iframe?apiKey=apiKey1&appNa' + diff --git a/packages/auth/test/rpchandler_test.js b/packages/auth/test/rpchandler_test.js index 18aee05f7b3..a23a4a59ff2 100644 --- a/packages/auth/test/rpchandler_test.js +++ b/packages/auth/test/rpchandler_test.js @@ -1193,7 +1193,7 @@ function testRequestStsToken_emulator() { expectedStsTokenResponse); // Set an emulator config. rpcHandler.updateEmulatorConfig( - { hostname: 'emulator.test.domain', port: 1234 }); + { url: 'http://emulator.test.domain:1234' }); // Send STS token request, default config will be used. rpcHandler .requestStsToken({ 'grant_type': 'authorization_code', 'code': 'idToken' }) @@ -1248,7 +1248,7 @@ function testRequestFirebaseEndpoint_emulator() { expectedResponse); // Set an emulator config. rpcHandler.updateEmulatorConfig( - { hostname: 'emulator.test.domain', port: 1234 }); + { url: 'http://emulator.test.domain:1234' }); rpcHandler .requestFirebaseEndpoint( @@ -1303,7 +1303,7 @@ function testRequestIdentityPlatformEndpoint_emulator() { expectedResponse); // Set an emulator config. rpcHandler.updateEmulatorConfig( - { hostname: 'emulator.test.domain', port: 1234 }); + { url: 'http://emulator.test.domain:1234' }); rpcHandler .requestIdentityPlatformEndpoint( 'method1', 'POST', { 'key1': 'value1', 'key2': 'value2' })