From 8b79f8cfdaeff181aa0dd592d480fbe70db3b666 Mon Sep 17 00:00:00 2001 From: austinbenoit Date: Tue, 13 Oct 2026 13:59:14 +0000 Subject: [PATCH 1/2] Auth (Desktop): Route SecureTokenRequest and SignUpRequest to Auth Emulator SecureTokenRequest (token refresh / GetToken) and SignUpRequest (linking an email/password credential to an anonymous account) hardcoded https:// production endpoints instead of calling AuthRequest::GetUrl(), bypassing the Auth Emulator. Parameterize AuthRequest::GetUrl(const char* server_url = kServerURL), use GetUrl(api_host) in SecureTokenRequest and SignUpRequest, and add unit tests verifying both production and emulator URLs across all desktop Auth RPC request classes. --- auth/src/desktop/rpcs/auth_request.cc | 6 +-- auth/src/desktop/rpcs/auth_request.h | 2 +- auth/src/desktop/rpcs/secure_token_request.cc | 8 ++-- auth/src/desktop/rpcs/sign_up_request.cc | 5 ++- .../desktop/rpcs/create_auth_uri_test.cc | 11 ++++++ .../tests/desktop/rpcs/delete_account_test.cc | 11 ++++++ .../desktop/rpcs/get_account_info_test.cc | 11 ++++++ .../rpcs/get_oob_confirmation_code_test.cc | 11 ++++++ .../tests/desktop/rpcs/reset_password_test.cc | 11 ++++++ auth/tests/desktop/rpcs/secure_token_test.cc | 11 ++++++ .../desktop/rpcs/set_account_info_test.cc | 12 ++++++ .../desktop/rpcs/sign_up_new_user_test.cc | 39 +++++++++++++++++++ .../desktop/rpcs/verify_assertion_test.cc | 12 ++++++ .../desktop/rpcs/verify_custom_token_test.cc | 11 ++++++ .../desktop/rpcs/verify_password_test.cc | 11 ++++++ release_build_files/readme.md | 7 ++++ 16 files changed, 168 insertions(+), 11 deletions(-) diff --git a/auth/src/desktop/rpcs/auth_request.cc b/auth/src/desktop/rpcs/auth_request.cc index a59fbb6927..d731fdd771 100644 --- a/auth/src/desktop/rpcs/auth_request.cc +++ b/auth/src/desktop/rpcs/auth_request.cc @@ -73,7 +73,7 @@ AuthRequest::AuthRequest(::firebase::App& app, const char* schema, } } -std::string AuthRequest::GetUrl() { +std::string AuthRequest::GetUrl(const char* server_url) { Auth* auth_ptr = Auth::GetAuth(&app); std::string assigned_emulator_url = static_cast(auth_ptr->auth_data_->auth_impl) @@ -81,13 +81,13 @@ std::string AuthRequest::GetUrl() { if (assigned_emulator_url.empty()) { std::string url(kHttps); - url += kServerURL; + url += server_url; return url; } else { std::string url(kHttp); url += assigned_emulator_url; url += "/"; - url += kServerURL; + url += server_url; return url; } } diff --git a/auth/src/desktop/rpcs/auth_request.h b/auth/src/desktop/rpcs/auth_request.h index fe14e1c96b..91e778d07d 100644 --- a/auth/src/desktop/rpcs/auth_request.h +++ b/auth/src/desktop/rpcs/auth_request.h @@ -52,7 +52,7 @@ class AuthRequest : AuthRequest(app, reinterpret_cast(schema), deliver_heartbeat) {} - std::string GetUrl(); + std::string GetUrl(const char* server_url = kServerURL); private: ::firebase::App& app; diff --git a/auth/src/desktop/rpcs/secure_token_request.cc b/auth/src/desktop/rpcs/secure_token_request.cc index 7ff7edf187..34274d0dfd 100644 --- a/auth/src/desktop/rpcs/secure_token_request.cc +++ b/auth/src/desktop/rpcs/secure_token_request.cc @@ -15,7 +15,7 @@ #include "auth/src/desktop/rpcs/secure_token_request.h" #include -#include +#include #include "app/src/assert.h" #include "app/src/include/firebase/app.h" @@ -30,10 +30,8 @@ SecureTokenRequest::SecureTokenRequest(::firebase::App& app, : AuthRequest(app, request_resource_data, false) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = "https://securetoken.googleapis.com/v1/token?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); - url.append(api_host); + const char api_host[] = "securetoken.googleapis.com/v1/token?key="; + std::string url = GetUrl(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/desktop/rpcs/sign_up_request.cc b/auth/src/desktop/rpcs/sign_up_request.cc index 29c27cdf0b..cb59fb9196 100644 --- a/auth/src/desktop/rpcs/sign_up_request.cc +++ b/auth/src/desktop/rpcs/sign_up_request.cc @@ -30,8 +30,9 @@ SignUpRequest::SignUpRequest(::firebase::App& app, const char* api_key) : AuthRequest(app, request_resource_data, true) { FIREBASE_ASSERT_RETURN_VOID(api_key); - std::string url( - "https://identitytoolkit.googleapis.com/v1/accounts:signUp?key="); + const char api_host[] = + "identitytoolkit.googleapis.com/v1/accounts:signUp?key="; + std::string url = GetUrl(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/tests/desktop/rpcs/create_auth_uri_test.cc b/auth/tests/desktop/rpcs/create_auth_uri_test.cc index 91a393f441..6ed1372c6d 100644 --- a/auth/tests/desktop/rpcs/create_auth_uri_test.cc +++ b/auth/tests/desktop/rpcs/create_auth_uri_test.cc @@ -20,6 +20,7 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/create_auth_uri_request.h" #include "auth/src/desktop/rpcs/create_auth_uri_response.h" +#include "auth/src/include/firebase/auth.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -42,6 +43,16 @@ TEST(CreateAuthUriTest, TestCreateAuthUriRequest) { request.options().post_fields); } +TEST(CreateAuthUriTest, TestCreateAuthUriRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + CreateAuthUriRequest request(*app, "APIKEY", "email"); + EXPECT_EQ( + "http://localhost:9099/www.googleapis.com/identitytoolkit/v3/" + "relyingparty/createAuthUri?key=APIKEY", + request.options().url); +} + // Test CreateAuthUriResponse TEST(CreateAuthUriTest, TestCreateAuthUriResponse) { std::unique_ptr app(testing::CreateApp()); diff --git a/auth/tests/desktop/rpcs/delete_account_test.cc b/auth/tests/desktop/rpcs/delete_account_test.cc index e6d8a98bcf..a66941265b 100644 --- a/auth/tests/desktop/rpcs/delete_account_test.cc +++ b/auth/tests/desktop/rpcs/delete_account_test.cc @@ -19,6 +19,7 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/delete_account_request.h" #include "auth/src/desktop/rpcs/delete_account_response.h" +#include "auth/src/include/firebase/auth.h" #include "auth/tests/desktop/rpcs/test_util.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -42,6 +43,16 @@ TEST(DeleteAccountTest, TestDeleteAccountRequest) { request.options().post_fields); } +TEST(DeleteAccountTest, TestDeleteAccountRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + DeleteAccountRequest request(*app, "APIKEY"); + EXPECT_EQ( + "http://localhost:9099/www.googleapis.com/identitytoolkit/v3/" + "relyingparty/deleteAccount?key=APIKEY", + request.options().url); +} + // Test DeleteAccountResponse TEST(DeleteAccountTest, TestDeleteAccountResponse) { std::unique_ptr app(testing::CreateApp()); diff --git a/auth/tests/desktop/rpcs/get_account_info_test.cc b/auth/tests/desktop/rpcs/get_account_info_test.cc index 368b079b93..d7b1b021d1 100644 --- a/auth/tests/desktop/rpcs/get_account_info_test.cc +++ b/auth/tests/desktop/rpcs/get_account_info_test.cc @@ -19,6 +19,7 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/get_account_info_request.h" #include "auth/src/desktop/rpcs/get_account_info_response.h" +#include "auth/src/include/firebase/auth.h" #include "auth/tests/desktop/rpcs/test_util.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -41,6 +42,16 @@ TEST(GetAccountInfoTest, TestGetAccountInfoRequest) { request.options().post_fields); } +TEST(GetAccountInfoTest, TestGetAccountInfoRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + GetAccountInfoRequest request(*app, "APIKEY", "token"); + EXPECT_EQ( + "http://localhost:9099/www.googleapis.com/identitytoolkit/v3/" + "relyingparty/getAccountInfo?key=APIKEY", + request.options().url); +} + // Test GetAccountInfoResponse TEST(GetAccountInfoTest, TestGetAccountInfoResponse) { std::unique_ptr app(App::Create(AppOptions())); diff --git a/auth/tests/desktop/rpcs/get_oob_confirmation_code_test.cc b/auth/tests/desktop/rpcs/get_oob_confirmation_code_test.cc index cf9717853d..c825051674 100644 --- a/auth/tests/desktop/rpcs/get_oob_confirmation_code_test.cc +++ b/auth/tests/desktop/rpcs/get_oob_confirmation_code_test.cc @@ -19,6 +19,7 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/get_oob_confirmation_code_request.h" #include "auth/src/desktop/rpcs/get_oob_confirmation_code_response.h" +#include "auth/src/include/firebase/auth.h" #include "auth/tests/desktop/rpcs/test_util.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -46,6 +47,16 @@ TEST(GetOobConfirmationCodeTest, SendVerifyEmailRequest) { request->options().post_fields); } +TEST(GetOobConfirmationCodeTest, SendVerifyEmailRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + auto request = RequestT::CreateSendEmailVerificationRequest(*app, "APIKEY"); + EXPECT_EQ( + "http://localhost:9099/www.googleapis.com/identitytoolkit/v3/" + "relyingparty/getOobConfirmationCode?key=APIKEY", + request->options().url); +} + TEST(GetOobConfirmationCodeTest, SendPasswordResetEmailRequest) { std::unique_ptr app(testing::CreateApp()); auto request = diff --git a/auth/tests/desktop/rpcs/reset_password_test.cc b/auth/tests/desktop/rpcs/reset_password_test.cc index 2901ca596e..4d57379d93 100644 --- a/auth/tests/desktop/rpcs/reset_password_test.cc +++ b/auth/tests/desktop/rpcs/reset_password_test.cc @@ -19,6 +19,7 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/reset_password_request.h" #include "auth/src/desktop/rpcs/reset_password_response.h" +#include "auth/src/include/firebase/auth.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -41,6 +42,16 @@ TEST(ResetPasswordTest, TestResetPasswordRequest) { request.options().post_fields); } +TEST(ResetPasswordTest, TestResetPasswordRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + ResetPasswordRequest request(*app, "APIKEY", "oob", "password"); + EXPECT_EQ( + "http://localhost:9099/www.googleapis.com/identitytoolkit/v3/" + "relyingparty/resetPassword?key=APIKEY", + request.options().url); +} + // Test ResetPasswordResponse TEST(ResetPasswordTest, TestResetPasswordResponse) { std::unique_ptr app(testing::CreateApp()); diff --git a/auth/tests/desktop/rpcs/secure_token_test.cc b/auth/tests/desktop/rpcs/secure_token_test.cc index ff6fd589c4..33e2f77b32 100644 --- a/auth/tests/desktop/rpcs/secure_token_test.cc +++ b/auth/tests/desktop/rpcs/secure_token_test.cc @@ -19,6 +19,7 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/secure_token_request.h" #include "auth/src/desktop/rpcs/secure_token_response.h" +#include "auth/src/include/firebase/auth.h" #include "auth/tests/desktop/rpcs/test_util.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -40,6 +41,16 @@ TEST(SecureTokenTest, TestSetRefreshRequest) { request.options().post_fields); } +TEST(SecureTokenTest, TestSetRefreshRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth* auth = Auth::GetAuth(app.get()); + auth->UseEmulator("localhost", 9099); + SecureTokenRequest request(*app, "APIKEY", "token123"); + EXPECT_EQ( + "http://localhost:9099/securetoken.googleapis.com/v1/token?key=APIKEY", + request.options().url); +} + // Test SecureTokenResponse TEST(SecureTokenTest, TestSecureTokenResponse) { std::unique_ptr app(testing::CreateApp()); diff --git a/auth/tests/desktop/rpcs/set_account_info_test.cc b/auth/tests/desktop/rpcs/set_account_info_test.cc index ce38726238..158cda32e3 100644 --- a/auth/tests/desktop/rpcs/set_account_info_test.cc +++ b/auth/tests/desktop/rpcs/set_account_info_test.cc @@ -19,6 +19,7 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/set_account_info_request.h" #include "auth/src/desktop/rpcs/set_account_info_response.h" +#include "auth/src/include/firebase/auth.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -48,6 +49,17 @@ TEST(SetAccountInfoTest, TestSetAccountInfoRequest_UpdateEmail) { request->options().post_fields); } +TEST(SetAccountInfoTest, TestSetAccountInfoRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + auto request = + RequestT::CreateUpdateEmailRequest(*app, "APIKEY", "fakeemail"); + EXPECT_EQ( + "http://localhost:9099/www.googleapis.com/identitytoolkit/v3/" + "relyingparty/setAccountInfo?key=APIKEY", + request->options().url); +} + TEST(SetAccountInfoTest, TestSetAccountInfoRequest_UpdatePassword) { std::unique_ptr app(testing::CreateApp()); auto request = diff --git a/auth/tests/desktop/rpcs/sign_up_new_user_test.cc b/auth/tests/desktop/rpcs/sign_up_new_user_test.cc index a7b3374bce..c8187adfc4 100644 --- a/auth/tests/desktop/rpcs/sign_up_new_user_test.cc +++ b/auth/tests/desktop/rpcs/sign_up_new_user_test.cc @@ -19,6 +19,8 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/sign_up_new_user_request.h" #include "auth/src/desktop/rpcs/sign_up_new_user_response.h" +#include "auth/src/desktop/rpcs/sign_up_request.h" +#include "auth/src/include/firebase/auth.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -40,6 +42,16 @@ TEST(SignUpNewUserTest, TestAnonymousSignInRequest) { request.options().post_fields); } +TEST(SignUpNewUserTest, TestAnonymousSignInRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + SignUpNewUserRequest request(*app, "APIKEY"); + EXPECT_EQ( + "http://localhost:9099/www.googleapis.com/identitytoolkit/v3/" + "relyingparty/signupNewUser?key=APIKEY", + request.options().url); +} + // Test SignUpNewUserRequest for using password signin TEST(SignUpNewUserTest, TestEmailPasswordSignInRequest) { std::unique_ptr app(testing::CreateApp()); @@ -58,6 +70,33 @@ TEST(SignUpNewUserTest, TestEmailPasswordSignInRequest) { request.options().post_fields); } +TEST(SignUpNewUserTest, TestSignUpRequestLinkWithEmailAndPassword) { + std::unique_ptr app(testing::CreateApp()); + auto request = SignUpRequest::CreateLinkWithEmailAndPasswordRequest( + *app, "APIKEY", "e@mail", "pwd"); + EXPECT_EQ( + "https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=APIKEY", + request->options().url); + EXPECT_EQ( + "{\n" + " \"email\": \"e@mail\",\n" + " \"password\": \"pwd\",\n" + " \"returnSecureToken\": true\n" + "}\n", + request->options().post_fields); +} + +TEST(SignUpNewUserTest, TestSignUpRequestLinkWithEmailAndPasswordWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + auto request = SignUpRequest::CreateLinkWithEmailAndPasswordRequest( + *app, "APIKEY", "e@mail", "pwd"); + EXPECT_EQ( + "http://localhost:9099/identitytoolkit.googleapis.com/v1/" + "accounts:signUp?key=APIKEY", + request->options().url); +} + // Test SignUpNewUserResponse TEST(SignUpNewUserTest, TestSignUpNewUserResponse) { std::unique_ptr app(testing::CreateApp()); diff --git a/auth/tests/desktop/rpcs/verify_assertion_test.cc b/auth/tests/desktop/rpcs/verify_assertion_test.cc index ba7139a6d6..37b9c8bbe6 100644 --- a/auth/tests/desktop/rpcs/verify_assertion_test.cc +++ b/auth/tests/desktop/rpcs/verify_assertion_test.cc @@ -19,6 +19,7 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/verify_assertion_request.h" #include "auth/src/desktop/rpcs/verify_assertion_response.h" +#include "auth/src/include/firebase/auth.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -42,6 +43,17 @@ TEST(VerifyAssertionTest, TestVerifyAssertionRequest_FromIdToken) { CheckUrl(*request); } +TEST(VerifyAssertionTest, TestVerifyAssertionRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + auto request = VerifyAssertionRequest::FromIdToken(*app, "APIKEY", "provider", + "id_token"); + EXPECT_EQ( + "http://localhost:9099/www.googleapis.com/identitytoolkit/v3/" + "relyingparty/verifyAssertion?key=APIKEY", + request->options().url); +} + TEST(VerifyAssertionTest, TestVerifyAssertionRequest_FromAccessToken) { std::unique_ptr app(testing::CreateApp()); auto request = VerifyAssertionRequest::FromAccessToken( diff --git a/auth/tests/desktop/rpcs/verify_custom_token_test.cc b/auth/tests/desktop/rpcs/verify_custom_token_test.cc index 7d4341d37b..5cab2769f9 100644 --- a/auth/tests/desktop/rpcs/verify_custom_token_test.cc +++ b/auth/tests/desktop/rpcs/verify_custom_token_test.cc @@ -19,6 +19,7 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/verify_custom_token_request.h" #include "auth/src/desktop/rpcs/verify_custom_token_response.h" +#include "auth/src/include/firebase/auth.h" #include "auth/tests/desktop/rpcs/test_util.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -42,6 +43,16 @@ TEST(VerifyCustomTokenTest, TestVerifyCustomTokenRequest) { request.options().post_fields); } +TEST(VerifyCustomTokenTest, TestVerifyCustomTokenRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + VerifyCustomTokenRequest request(*app, "APIKEY", "token123"); + EXPECT_EQ( + "http://localhost:9099/www.googleapis.com/identitytoolkit/v3/" + "relyingparty/verifyCustomToken?key=APIKEY", + request.options().url); +} + // Test VerifyCustomTokenResponse TEST(VerifyCustomTokenTest, TestVerifyCustomTokenResponse) { std::unique_ptr app(testing::CreateApp()); diff --git a/auth/tests/desktop/rpcs/verify_password_test.cc b/auth/tests/desktop/rpcs/verify_password_test.cc index 0383245467..516075c01c 100644 --- a/auth/tests/desktop/rpcs/verify_password_test.cc +++ b/auth/tests/desktop/rpcs/verify_password_test.cc @@ -19,6 +19,7 @@ #include "app/tests/include/firebase/app_for_testing.h" #include "auth/src/desktop/rpcs/verify_password_request.h" #include "auth/src/desktop/rpcs/verify_password_response.h" +#include "auth/src/include/firebase/auth.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -42,6 +43,16 @@ TEST(VerifyPasswordTest, TestVerifyPasswordRequest) { request.options().post_fields); } +TEST(VerifyPasswordTest, TestVerifyPasswordRequestWithEmulator) { + std::unique_ptr app(testing::CreateApp()); + Auth::GetAuth(app.get())->UseEmulator("localhost", 9099); + VerifyPasswordRequest request(*app, "APIKEY", "abc@email", "pwd"); + EXPECT_EQ( + "http://localhost:9099/www.googleapis.com/identitytoolkit/v3/" + "relyingparty/verifyPassword?key=APIKEY", + request.options().url); +} + // Test VerifyPasswordResponse TEST(VerifyPasswordTest, TestVerifyPasswordResponse) { std::unique_ptr app(testing::CreateApp()); diff --git a/release_build_files/readme.md b/release_build_files/readme.md index 903558761e..e2f4efe3d4 100644 --- a/release_build_files/readme.md +++ b/release_build_files/readme.md @@ -613,6 +613,13 @@ workflow use only during the development of your app, not for publicly shipping code. ## Release Notes +### Upcoming +- Changes + - Auth (Desktop): Fixed an issue where refreshing or fetching an ID token + (`GetToken`) or linking an email/password credential to an anonymous + account failed when using the Auth Emulator, because `SecureTokenRequest` + and `SignUpRequest` were always sent to production endpoints. + ### 14.0.0 - Changes - General (Android): Update to Firebase Android BoM version 35.0.0. From ca30d9a38d470d40c220b96c7df86da71ae65a1d Mon Sep 17 00:00:00 2001 From: austinbenoit Date: Wed, 14 Oct 2026 14:26:31 +0000 Subject: [PATCH 2/2] Check for null server_url in AuthRequest::GetUrl --- auth/src/desktop/rpcs/auth_request.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/auth/src/desktop/rpcs/auth_request.cc b/auth/src/desktop/rpcs/auth_request.cc index d731fdd771..ac4acc6bde 100644 --- a/auth/src/desktop/rpcs/auth_request.cc +++ b/auth/src/desktop/rpcs/auth_request.cc @@ -74,6 +74,9 @@ AuthRequest::AuthRequest(::firebase::App& app, const char* schema, } std::string AuthRequest::GetUrl(const char* server_url) { + if (server_url == nullptr) { + return ""; + } Auth* auth_ptr = Auth::GetAuth(&app); std::string assigned_emulator_url = static_cast(auth_ptr->auth_data_->auth_impl)