Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2632)

Unified Diff: chrome/browser/extensions/api/identity/identity_api.cc

Issue 2668203004: Move impl of identity.GetAuthToken() extension API to its own file (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « chrome/browser/extensions/api/identity/identity_api.h ('k') | chrome/browser/extensions/api/identity/identity_apitest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698