Index: chrome/browser/extensions/api/identity/identity_api.cc |
diff --git a/chrome/browser/extensions/api/identity/identity_api.cc b/chrome/browser/extensions/api/identity/identity_api.cc |
index 4b74c3fe3091562a2cdfa3c8fab47451caee05a5..44d1e1379404a969e9e4d40e3662e863c1637b60 100644 |
--- a/chrome/browser/extensions/api/identity/identity_api.cc |
+++ b/chrome/browser/extensions/api/identity/identity_api.cc |
@@ -47,37 +47,8 @@ |
#include "google_apis/gaia/gaia_urls.h" |
#include "url/gurl.h" |
-#if defined(OS_CHROMEOS) |
-#include "chrome/browser/chromeos/login/session/user_session_manager.h" |
-#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
-#include "chrome/browser/chromeos/settings/device_oauth2_token_service.h" |
-#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h" |
-#include "components/user_manager/user_manager.h" |
-#include "google_apis/gaia/gaia_constants.h" |
-#endif |
- |
namespace extensions { |
-namespace { |
- |
-#if defined(OS_CHROMEOS) |
-// The list of apps that are allowed to use the Identity API to retrieve the |
-// token from the device robot account in a public session. |
-const char* const kPublicSessionAllowedOrigins[] = { |
- // Chrome Remote Desktop - Chromium branding. |
- "chrome-extension://ljacajndfccfgnfohlgkdphmbnpkjflk/", |
- // Chrome Remote Desktop - Official branding. |
- "chrome-extension://gbchcmhmhahfdphkhkmpfmihenigjmpp/"}; |
-#endif |
- |
-std::string GetPrimaryAccountId(content::BrowserContext* context) { |
- SigninManagerBase* signin_manager = |
- SigninManagerFactory::GetForProfile(Profile::FromBrowserContext(context)); |
- return signin_manager->GetAuthenticatedAccountId(); |
-} |
- |
-} // namespace |
- |
namespace identity = api::identity; |
IdentityTokenCacheValue::IdentityTokenCacheValue() |
@@ -186,7 +157,6 @@ const IdentityAPI::CachedTokens& IdentityAPI::GetAllCachedTokens() { |
} |
std::vector<std::string> IdentityAPI::GetAccounts() const { |
- const std::string primary_account_id = GetPrimaryAccountId(browser_context_); |
const std::vector<gaia::AccountIds> ids = account_tracker_.GetAccounts(); |
std::vector<std::string> gaia_ids; |
@@ -282,595 +252,4 @@ ExtensionFunction::ResponseAction IdentityGetAccountsFunction::Run() { |
return RespondNow(OneArgument(std::move(infos))); |
} |
-IdentityGetAuthTokenFunction::IdentityGetAuthTokenFunction() |
- : OAuth2TokenService::Consumer("extensions_identity_api"), |
- interactive_(false), |
- should_prompt_for_scopes_(false), |
- should_prompt_for_signin_(false) { |
-} |
- |
-IdentityGetAuthTokenFunction::~IdentityGetAuthTokenFunction() { |
- TRACE_EVENT_ASYNC_END0("identity", "IdentityGetAuthTokenFunction", this); |
-} |
- |
-bool IdentityGetAuthTokenFunction::RunAsync() { |
- TRACE_EVENT_ASYNC_BEGIN1("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "extension", |
- extension()->id()); |
- |
- if (GetProfile()->IsOffTheRecord()) { |
- error_ = identity_constants::kOffTheRecord; |
- return false; |
- } |
- |
- std::unique_ptr<identity::GetAuthToken::Params> params( |
- identity::GetAuthToken::Params::Create(*args_)); |
- EXTENSION_FUNCTION_VALIDATE(params.get()); |
- interactive_ = params->details.get() && |
- params->details->interactive.get() && |
- *params->details->interactive; |
- |
- should_prompt_for_scopes_ = interactive_; |
- should_prompt_for_signin_ = interactive_; |
- |
- const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension()); |
- |
- // Check that the necessary information is present in the manifest. |
- oauth2_client_id_ = GetOAuth2ClientId(); |
- if (oauth2_client_id_.empty()) { |
- error_ = identity_constants::kInvalidClientId; |
- return false; |
- } |
- |
- std::set<std::string> scopes(oauth2_info.scopes.begin(), |
- oauth2_info.scopes.end()); |
- |
- std::string account_key = GetPrimaryAccountId(GetProfile()); |
- |
- if (params->details.get()) { |
- if (params->details->account.get()) { |
- std::string detail_key = |
- extensions::IdentityAPI::GetFactoryInstance() |
- ->Get(GetProfile()) |
- ->FindAccountKeyByGaiaId(params->details->account->id); |
- |
- if (detail_key != account_key) { |
- if (detail_key.empty() || !switches::IsExtensionsMultiAccount()) { |
- // TODO(courage): should this be a different error? |
- error_ = identity_constants::kUserNotSignedIn; |
- return false; |
- } |
- |
- account_key = detail_key; |
- } |
- } |
- |
- if (params->details->scopes.get()) { |
- scopes = std::set<std::string>(params->details->scopes->begin(), |
- params->details->scopes->end()); |
- } |
- } |
- |
- if (scopes.size() == 0) { |
- error_ = identity_constants::kInvalidScopes; |
- return false; |
- } |
- |
- token_key_.reset( |
- new ExtensionTokenKey(extension()->id(), account_key, scopes)); |
- |
- // From here on out, results must be returned asynchronously. |
- StartAsyncRun(); |
- |
-#if defined(OS_CHROMEOS) |
- policy::BrowserPolicyConnectorChromeOS* connector = |
- g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
- bool is_kiosk = user_manager::UserManager::Get()->IsLoggedInAsKioskApp(); |
- bool is_public_session = |
- user_manager::UserManager::Get()->IsLoggedInAsPublicAccount(); |
- |
- if (connector->IsEnterpriseManaged() && (is_kiosk || is_public_session)) { |
- if (is_public_session && !IsOriginWhitelistedInPublicSession()) { |
- CompleteFunctionWithError(identity_constants::kUserNotSignedIn); |
- return true; |
- } |
- |
- StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE); |
- return true; |
- } |
-#endif |
- |
- if (!HasLoginToken()) { |
- if (!should_prompt_for_signin_) { |
- CompleteFunctionWithError(identity_constants::kUserNotSignedIn); |
- return true; |
- } |
- // Display a login prompt. |
- StartSigninFlow(); |
- } else { |
- StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE); |
- } |
- |
- return true; |
-} |
- |
-void IdentityGetAuthTokenFunction::StartAsyncRun() { |
- // Balanced in CompleteAsyncRun |
- AddRef(); |
- extensions::IdentityAPI::GetFactoryInstance() |
- ->Get(GetProfile()) |
- ->set_get_auth_token_function(this); |
-} |
- |
-void IdentityGetAuthTokenFunction::CompleteAsyncRun(bool success) { |
- extensions::IdentityAPI::GetFactoryInstance() |
- ->Get(GetProfile()) |
- ->set_get_auth_token_function(nullptr); |
- |
- SendResponse(success); |
- Release(); // Balanced in StartAsyncRun |
-} |
- |
-void IdentityGetAuthTokenFunction::CompleteFunctionWithResult( |
- const std::string& access_token) { |
- SetResult(base::MakeUnique<base::StringValue>(access_token)); |
- CompleteAsyncRun(true); |
-} |
- |
-void IdentityGetAuthTokenFunction::CompleteFunctionWithError( |
- const std::string& error) { |
- TRACE_EVENT_ASYNC_STEP_PAST1("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "CompleteFunctionWithError", |
- "error", |
- error); |
- error_ = error; |
- CompleteAsyncRun(false); |
-} |
- |
-void IdentityGetAuthTokenFunction::StartSigninFlow() { |
- // All cached tokens are invalid because the user is not signed in. |
- IdentityAPI* id_api = |
- extensions::IdentityAPI::GetFactoryInstance()->Get(GetProfile()); |
- id_api->EraseAllCachedTokens(); |
- // Display a login prompt. If the subsequent mint fails, don't display the |
- // login prompt again. |
- should_prompt_for_signin_ = false; |
- ShowLoginPopup(); |
-} |
- |
-void IdentityGetAuthTokenFunction::StartMintTokenFlow( |
- IdentityMintRequestQueue::MintType type) { |
- mint_token_flow_type_ = type; |
- |
- // Flows are serialized to prevent excessive traffic to GAIA, and |
- // to consolidate UI pop-ups. |
- IdentityAPI* id_api = |
- extensions::IdentityAPI::GetFactoryInstance()->Get(GetProfile()); |
- |
- if (!should_prompt_for_scopes_) { |
- // Caller requested no interaction. |
- |
- if (type == IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE) { |
- // GAIA told us to do a consent UI. |
- CompleteFunctionWithError(identity_constants::kNoGrant); |
- return; |
- } |
- if (!id_api->mint_queue()->empty( |
- IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE, *token_key_)) { |
- // Another call is going through a consent UI. |
- CompleteFunctionWithError(identity_constants::kNoGrant); |
- return; |
- } |
- } |
- id_api->mint_queue()->RequestStart(type, *token_key_, this); |
-} |
- |
-void IdentityGetAuthTokenFunction::CompleteMintTokenFlow() { |
- IdentityMintRequestQueue::MintType type = mint_token_flow_type_; |
- |
- extensions::IdentityAPI::GetFactoryInstance() |
- ->Get(GetProfile()) |
- ->mint_queue() |
- ->RequestComplete(type, *token_key_, this); |
-} |
- |
-void IdentityGetAuthTokenFunction::StartMintToken( |
- IdentityMintRequestQueue::MintType type) { |
- TRACE_EVENT_ASYNC_STEP_PAST1("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "StartMintToken", |
- "type", |
- type); |
- |
- const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension()); |
- IdentityAPI* id_api = IdentityAPI::GetFactoryInstance()->Get(GetProfile()); |
- IdentityTokenCacheValue cache_entry = id_api->GetCachedToken(*token_key_); |
- IdentityTokenCacheValue::CacheValueStatus cache_status = |
- cache_entry.status(); |
- |
- if (type == IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE) { |
- switch (cache_status) { |
- case IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND: |
-#if defined(OS_CHROMEOS) |
- // Always force minting token for ChromeOS kiosk app and public session. |
- if (user_manager::UserManager::Get()->IsLoggedInAsPublicAccount() && |
- !IsOriginWhitelistedInPublicSession()) { |
- CompleteFunctionWithError(identity_constants::kUserNotSignedIn); |
- return; |
- } |
- |
- if (user_manager::UserManager::Get()->IsLoggedInAsKioskApp() || |
- user_manager::UserManager::Get()->IsLoggedInAsPublicAccount()) { |
- gaia_mint_token_mode_ = OAuth2MintTokenFlow::MODE_MINT_TOKEN_FORCE; |
- policy::BrowserPolicyConnectorChromeOS* connector = |
- g_browser_process->platform_part() |
- ->browser_policy_connector_chromeos(); |
- if (connector->IsEnterpriseManaged()) { |
- StartDeviceLoginAccessTokenRequest(); |
- } else { |
- StartLoginAccessTokenRequest(); |
- } |
- return; |
- } |
-#endif |
- |
- if (oauth2_info.auto_approve) |
- // oauth2_info.auto_approve is protected by a whitelist in |
- // _manifest_features.json hence only selected extensions take |
- // advantage of forcefully minting the token. |
- gaia_mint_token_mode_ = OAuth2MintTokenFlow::MODE_MINT_TOKEN_FORCE; |
- else |
- gaia_mint_token_mode_ = OAuth2MintTokenFlow::MODE_MINT_TOKEN_NO_FORCE; |
- StartLoginAccessTokenRequest(); |
- break; |
- |
- case IdentityTokenCacheValue::CACHE_STATUS_TOKEN: |
- CompleteMintTokenFlow(); |
- CompleteFunctionWithResult(cache_entry.token()); |
- break; |
- |
- case IdentityTokenCacheValue::CACHE_STATUS_ADVICE: |
- CompleteMintTokenFlow(); |
- should_prompt_for_signin_ = false; |
- issue_advice_ = cache_entry.issue_advice(); |
- StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE); |
- break; |
- } |
- } else { |
- DCHECK(type == IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE); |
- |
- if (cache_status == IdentityTokenCacheValue::CACHE_STATUS_TOKEN) { |
- CompleteMintTokenFlow(); |
- CompleteFunctionWithResult(cache_entry.token()); |
- } else { |
- ShowOAuthApprovalDialog(issue_advice_); |
- } |
- } |
-} |
- |
-void IdentityGetAuthTokenFunction::OnMintTokenSuccess( |
- const std::string& access_token, int time_to_live) { |
- TRACE_EVENT_ASYNC_STEP_PAST0("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "OnMintTokenSuccess"); |
- |
- IdentityTokenCacheValue token(access_token, |
- base::TimeDelta::FromSeconds(time_to_live)); |
- IdentityAPI::GetFactoryInstance()->Get(GetProfile())->SetCachedToken( |
- *token_key_, token); |
- |
- CompleteMintTokenFlow(); |
- CompleteFunctionWithResult(access_token); |
-} |
- |
-void IdentityGetAuthTokenFunction::OnMintTokenFailure( |
- const GoogleServiceAuthError& error) { |
- TRACE_EVENT_ASYNC_STEP_PAST1("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "OnMintTokenFailure", |
- "error", |
- error.ToString()); |
- CompleteMintTokenFlow(); |
- switch (error.state()) { |
- case GoogleServiceAuthError::SERVICE_ERROR: |
- if (interactive_) { |
- StartSigninFlow(); |
- return; |
- } |
- break; |
- case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: |
- case GoogleServiceAuthError::ACCOUNT_DELETED: |
- case GoogleServiceAuthError::ACCOUNT_DISABLED: |
- // TODO(courage): flush ticket and retry once |
- if (should_prompt_for_signin_) { |
- // Display a login prompt and try again (once). |
- StartSigninFlow(); |
- return; |
- } |
- break; |
- default: |
- // Return error to caller. |
- break; |
- } |
- |
- CompleteFunctionWithError( |
- std::string(identity_constants::kAuthFailure) + error.ToString()); |
-} |
- |
-void IdentityGetAuthTokenFunction::OnIssueAdviceSuccess( |
- const IssueAdviceInfo& issue_advice) { |
- TRACE_EVENT_ASYNC_STEP_PAST0("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "OnIssueAdviceSuccess"); |
- |
- IdentityAPI::GetFactoryInstance()->Get(GetProfile())->SetCachedToken( |
- *token_key_, IdentityTokenCacheValue(issue_advice)); |
- CompleteMintTokenFlow(); |
- |
- should_prompt_for_signin_ = false; |
- // Existing grant was revoked and we used NO_FORCE, so we got info back |
- // instead. Start a consent UI if we can. |
- issue_advice_ = issue_advice; |
- StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE); |
-} |
- |
-void IdentityGetAuthTokenFunction::SigninSuccess() { |
- TRACE_EVENT_ASYNC_STEP_PAST0("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "SigninSuccess"); |
- |
- // If there was no account associated this profile before the |
- // sign-in, we may not have an account_id in the token_key yet. |
- if (token_key_->account_id.empty()) { |
- token_key_->account_id = GetPrimaryAccountId(GetProfile()); |
- } |
- |
- StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE); |
-} |
- |
-void IdentityGetAuthTokenFunction::SigninFailed() { |
- TRACE_EVENT_ASYNC_STEP_PAST0("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "SigninFailed"); |
- CompleteFunctionWithError(identity_constants::kUserNotSignedIn); |
-} |
- |
-void IdentityGetAuthTokenFunction::OnGaiaFlowFailure( |
- GaiaWebAuthFlow::Failure failure, |
- GoogleServiceAuthError service_error, |
- const std::string& oauth_error) { |
- CompleteMintTokenFlow(); |
- std::string error; |
- |
- switch (failure) { |
- case GaiaWebAuthFlow::WINDOW_CLOSED: |
- error = identity_constants::kUserRejected; |
- break; |
- |
- case GaiaWebAuthFlow::INVALID_REDIRECT: |
- error = identity_constants::kInvalidRedirect; |
- break; |
- |
- case GaiaWebAuthFlow::SERVICE_AUTH_ERROR: |
- // If this is really an authentication error and not just a transient |
- // network error, and this is an interactive request for a signed-in |
- // user, then we show signin UI instead of failing. |
- if (service_error.state() != GoogleServiceAuthError::CONNECTION_FAILED && |
- service_error.state() != |
- GoogleServiceAuthError::SERVICE_UNAVAILABLE && |
- interactive_ && HasLoginToken()) { |
- StartSigninFlow(); |
- return; |
- } |
- error = std::string(identity_constants::kAuthFailure) + |
- service_error.ToString(); |
- break; |
- |
- case GaiaWebAuthFlow::OAUTH_ERROR: |
- error = MapOAuth2ErrorToDescription(oauth_error); |
- break; |
- |
- case GaiaWebAuthFlow::LOAD_FAILED: |
- error = identity_constants::kPageLoadFailure; |
- break; |
- |
- default: |
- NOTREACHED() << "Unexpected error from gaia web auth flow: " << failure; |
- error = identity_constants::kInvalidRedirect; |
- break; |
- } |
- |
- CompleteFunctionWithError(error); |
-} |
- |
-void IdentityGetAuthTokenFunction::OnGaiaFlowCompleted( |
- const std::string& access_token, |
- const std::string& expiration) { |
- TRACE_EVENT_ASYNC_STEP_PAST0("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "OnGaiaFlowCompleted"); |
- int time_to_live; |
- if (!expiration.empty() && base::StringToInt(expiration, &time_to_live)) { |
- IdentityTokenCacheValue token_value( |
- access_token, base::TimeDelta::FromSeconds(time_to_live)); |
- IdentityAPI::GetFactoryInstance()->Get(GetProfile())->SetCachedToken( |
- *token_key_, token_value); |
- } |
- |
- CompleteMintTokenFlow(); |
- CompleteFunctionWithResult(access_token); |
-} |
- |
-void IdentityGetAuthTokenFunction::OnGetTokenSuccess( |
- const OAuth2TokenService::Request* request, |
- const std::string& access_token, |
- const base::Time& expiration_time) { |
- TRACE_EVENT_ASYNC_STEP_PAST1("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "OnGetTokenSuccess", |
- "account", |
- request->GetAccountId()); |
- login_token_request_.reset(); |
- StartGaiaRequest(access_token); |
-} |
- |
-void IdentityGetAuthTokenFunction::OnGetTokenFailure( |
- const OAuth2TokenService::Request* request, |
- const GoogleServiceAuthError& error) { |
- TRACE_EVENT_ASYNC_STEP_PAST1("identity", |
- "IdentityGetAuthTokenFunction", |
- this, |
- "OnGetTokenFailure", |
- "error", |
- error.ToString()); |
- login_token_request_.reset(); |
- OnGaiaFlowFailure(GaiaWebAuthFlow::SERVICE_AUTH_ERROR, error, std::string()); |
-} |
- |
-void IdentityGetAuthTokenFunction::Shutdown() { |
- gaia_web_auth_flow_.reset(); |
- signin_flow_.reset(); |
- login_token_request_.reset(); |
- extensions::IdentityAPI::GetFactoryInstance() |
- ->Get(GetProfile()) |
- ->mint_queue() |
- ->RequestCancel(*token_key_, this); |
- CompleteFunctionWithError(identity_constants::kCanceled); |
-} |
- |
-#if defined(OS_CHROMEOS) |
-void IdentityGetAuthTokenFunction::StartDeviceLoginAccessTokenRequest() { |
- chromeos::DeviceOAuth2TokenService* service = |
- chromeos::DeviceOAuth2TokenServiceFactory::Get(); |
- // Since robot account refresh tokens are scoped down to [any-api] only, |
- // request access token for [any-api] instead of login. |
- OAuth2TokenService::ScopeSet scopes; |
- scopes.insert(GaiaConstants::kAnyApiOAuth2Scope); |
- login_token_request_ = |
- service->StartRequest(service->GetRobotAccountId(), |
- scopes, |
- this); |
-} |
- |
-bool IdentityGetAuthTokenFunction::IsOriginWhitelistedInPublicSession() { |
- DCHECK(extension()); |
- GURL extension_url = extension()->url(); |
- for (size_t i = 0; i < arraysize(kPublicSessionAllowedOrigins); i++) { |
- URLPattern allowed_origin(URLPattern::SCHEME_ALL, |
- kPublicSessionAllowedOrigins[i]); |
- if (allowed_origin.MatchesSecurityOrigin(extension_url)) { |
- return true; |
- } |
- } |
- return false; |
-} |
-#endif |
- |
-void IdentityGetAuthTokenFunction::StartLoginAccessTokenRequest() { |
- ProfileOAuth2TokenService* service = |
- ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile()); |
-#if defined(OS_CHROMEOS) |
- if (chrome::IsRunningInForcedAppMode()) { |
- std::string app_client_id; |
- std::string app_client_secret; |
- if (chromeos::UserSessionManager::GetInstance()-> |
- GetAppModeChromeClientOAuthInfo(&app_client_id, |
- &app_client_secret)) { |
- login_token_request_ = |
- service->StartRequestForClient(token_key_->account_id, |
- app_client_id, |
- app_client_secret, |
- OAuth2TokenService::ScopeSet(), |
- this); |
- return; |
- } |
- } |
-#endif |
- login_token_request_ = service->StartRequest( |
- token_key_->account_id, OAuth2TokenService::ScopeSet(), this); |
-} |
- |
-void IdentityGetAuthTokenFunction::StartGaiaRequest( |
- const std::string& login_access_token) { |
- DCHECK(!login_access_token.empty()); |
- mint_token_flow_.reset(CreateMintTokenFlow()); |
- mint_token_flow_->Start(GetProfile()->GetRequestContext(), |
- login_access_token); |
-} |
- |
-void IdentityGetAuthTokenFunction::ShowLoginPopup() { |
- signin_flow_.reset(new IdentitySigninFlow(this, GetProfile())); |
- signin_flow_->Start(); |
-} |
- |
-void IdentityGetAuthTokenFunction::ShowOAuthApprovalDialog( |
- const IssueAdviceInfo& issue_advice) { |
- const std::string locale = extension_l10n_util::CurrentLocaleOrDefault(); |
- |
- gaia_web_auth_flow_.reset(new GaiaWebAuthFlow( |
- this, GetProfile(), token_key_.get(), oauth2_client_id_, locale)); |
- gaia_web_auth_flow_->Start(); |
-} |
- |
-OAuth2MintTokenFlow* IdentityGetAuthTokenFunction::CreateMintTokenFlow() { |
- SigninClient* signin_client = |
- ChromeSigninClientFactory::GetForProfile(GetProfile()); |
- std::string signin_scoped_device_id = |
- signin_client->GetSigninScopedDeviceId(); |
- OAuth2MintTokenFlow* mint_token_flow = new OAuth2MintTokenFlow( |
- this, |
- OAuth2MintTokenFlow::Parameters( |
- extension()->id(), |
- oauth2_client_id_, |
- std::vector<std::string>(token_key_->scopes.begin(), |
- token_key_->scopes.end()), |
- signin_scoped_device_id, |
- gaia_mint_token_mode_)); |
- return mint_token_flow; |
-} |
- |
-bool IdentityGetAuthTokenFunction::HasLoginToken() const { |
- ProfileOAuth2TokenService* token_service = |
- ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile()); |
- return token_service->RefreshTokenIsAvailable(token_key_->account_id); |
-} |
- |
-std::string IdentityGetAuthTokenFunction::MapOAuth2ErrorToDescription( |
- const std::string& error) { |
- const char kOAuth2ErrorAccessDenied[] = "access_denied"; |
- const char kOAuth2ErrorInvalidScope[] = "invalid_scope"; |
- |
- if (error == kOAuth2ErrorAccessDenied) |
- return std::string(identity_constants::kUserRejected); |
- else if (error == kOAuth2ErrorInvalidScope) |
- return std::string(identity_constants::kInvalidScopes); |
- else |
- return std::string(identity_constants::kAuthFailure) + error; |
-} |
- |
-std::string IdentityGetAuthTokenFunction::GetOAuth2ClientId() const { |
- const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension()); |
- std::string client_id = oauth2_info.client_id; |
- |
- // Component apps using auto_approve may use Chrome's client ID by |
- // omitting the field. |
- if (client_id.empty() && extension()->location() == Manifest::COMPONENT && |
- oauth2_info.auto_approve) { |
- client_id = GaiaUrls::GetInstance()->oauth2_chrome_client_id(); |
- } |
- return client_id; |
-} |
- |
} // namespace extensions |