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

Side by Side Diff: chrome/browser/extensions/api/identity/identity_api.cc

Issue 293063002: Multiple account support in chrome.identity.getAuthToken (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix missing word in docs Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/identity/identity_api.h" 5 #include "chrome/browser/extensions/api/identity/identity_api.h"
6 6
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 const IdentityTokenCacheValue& IdentityAPI::GetCachedToken( 162 const IdentityTokenCacheValue& IdentityAPI::GetCachedToken(
163 const ExtensionTokenKey& key) { 163 const ExtensionTokenKey& key) {
164 return token_cache_[key]; 164 return token_cache_[key];
165 } 165 }
166 166
167 const IdentityAPI::CachedTokens& IdentityAPI::GetAllCachedTokens() { 167 const IdentityAPI::CachedTokens& IdentityAPI::GetAllCachedTokens() {
168 return token_cache_; 168 return token_cache_;
169 } 169 }
170 170
171 std::vector<std::string> IdentityAPI::GetAccounts() const { 171 std::vector<std::string> IdentityAPI::GetAccounts() const {
172 const std::string primary_account_id = GetPrimaryAccountId(browser_context_);
172 const std::vector<AccountIds> ids = account_tracker_.GetAccounts(); 173 const std::vector<AccountIds> ids = account_tracker_.GetAccounts();
173 std::vector<std::string> gaia_ids; 174 std::vector<std::string> gaia_ids;
174 175
175 if (switches::IsExtensionsMultiAccount()) { 176 if (switches::IsExtensionsMultiAccount()) {
176 for (std::vector<AccountIds>::const_iterator it = ids.begin(); 177 for (std::vector<AccountIds>::const_iterator it = ids.begin();
177 it != ids.end(); 178 it != ids.end();
178 ++it) { 179 ++it) {
179 gaia_ids.push_back(it->gaia); 180 gaia_ids.push_back(it->gaia);
180 } 181 }
181 } else if (ids.size() >= 1) { 182 } else if (ids.size() >= 1) {
182 gaia_ids.push_back(ids[0].gaia); 183 gaia_ids.push_back(ids[0].gaia);
183 } 184 }
184 185
185 return gaia_ids; 186 return gaia_ids;
186 } 187 }
187 188
189 std::string IdentityAPI::FindAccountKeyByGaiaId(const std::string& gaia_id) {
190 return account_tracker_.FindAccountKeyByGaiaId(gaia_id);
191 }
192
188 void IdentityAPI::ReportAuthError(const GoogleServiceAuthError& error) { 193 void IdentityAPI::ReportAuthError(const GoogleServiceAuthError& error) {
189 account_tracker_.ReportAuthError(GetPrimaryAccountId(browser_context_), 194 account_tracker_.ReportAuthError(GetPrimaryAccountId(browser_context_),
190 error); 195 error);
191 } 196 }
192 197
193 GoogleServiceAuthError IdentityAPI::GetAuthStatusForTest() const { 198 GoogleServiceAuthError IdentityAPI::GetAuthStatusForTest() const {
194 return account_tracker_.GetAuthStatus(); 199 return account_tracker_.GetAuthStatus();
195 } 200 }
196 201
197 void IdentityAPI::Shutdown() { 202 void IdentityAPI::Shutdown() {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 return false; 315 return false;
311 } 316 }
312 317
313 if (oauth2_info.scopes.size() == 0) { 318 if (oauth2_info.scopes.size() == 0) {
314 error_ = identity_constants::kInvalidScopes; 319 error_ = identity_constants::kInvalidScopes;
315 return false; 320 return false;
316 } 321 }
317 322
318 std::set<std::string> scopes(oauth2_info.scopes.begin(), 323 std::set<std::string> scopes(oauth2_info.scopes.begin(),
319 oauth2_info.scopes.end()); 324 oauth2_info.scopes.end());
320 token_key_.reset(new ExtensionTokenKey( 325
321 GetExtension()->id(), GetPrimaryAccountId(GetProfile()), scopes)); 326 std::string account_key = GetPrimaryAccountId(GetProfile());
327
328 if (params->details->account.get()) {
329 std::string detail_key =
330 extensions::IdentityAPI::GetFactoryInstance()
331 ->Get(GetProfile())
332 ->FindAccountKeyByGaiaId(params->details->account->id);
333
334 if (detail_key != account_key) {
335 if (detail_key.empty() || !switches::IsExtensionsMultiAccount()) {
336 // TODO(courage): should this be a different error?
337 error_ = identity_constants::kUserNotSignedIn;
338 return false;
339 }
340
341 account_key = detail_key;
342 }
343 }
344
345 token_key_.reset(
346 new ExtensionTokenKey(GetExtension()->id(), account_key, scopes));
322 347
323 // From here on out, results must be returned asynchronously. 348 // From here on out, results must be returned asynchronously.
324 StartAsyncRun(); 349 StartAsyncRun();
325 350
326 #if defined(OS_CHROMEOS) 351 #if defined(OS_CHROMEOS)
327 policy::BrowserPolicyConnectorChromeOS* connector = 352 policy::BrowserPolicyConnectorChromeOS* connector =
328 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 353 g_browser_process->platform_part()->browser_policy_connector_chromeos();
329 if (chromeos::UserManager::Get()->IsLoggedInAsKioskApp() && 354 if (chromeos::UserManager::Get()->IsLoggedInAsKioskApp() &&
330 connector->IsEnterpriseManaged()) { 355 connector->IsEnterpriseManaged()) {
331 StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE); 356 StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE);
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 void IdentityGetAuthTokenFunction::StartLoginAccessTokenRequest() { 670 void IdentityGetAuthTokenFunction::StartLoginAccessTokenRequest() {
646 ProfileOAuth2TokenService* service = 671 ProfileOAuth2TokenService* service =
647 ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile()); 672 ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile());
648 const std::string primary_account_id = GetPrimaryAccountId(GetProfile()); 673 const std::string primary_account_id = GetPrimaryAccountId(GetProfile());
649 #if defined(OS_CHROMEOS) 674 #if defined(OS_CHROMEOS)
650 if (chrome::IsRunningInForcedAppMode()) { 675 if (chrome::IsRunningInForcedAppMode()) {
651 std::string app_client_id; 676 std::string app_client_id;
652 std::string app_client_secret; 677 std::string app_client_secret;
653 if (chromeos::UserManager::Get()->GetAppModeChromeClientOAuthInfo( 678 if (chromeos::UserManager::Get()->GetAppModeChromeClientOAuthInfo(
654 &app_client_id, &app_client_secret)) { 679 &app_client_id, &app_client_secret)) {
680 // TODO(courage): figure out what account should be here
fgorski 2014/06/03 23:46:40 I'd check with bartfab, but based on my exchange w
Michael Courage 2014/06/04 23:37:38 Right thing to do here is use the account establis
655 login_token_request_ = 681 login_token_request_ =
656 service->StartRequestForClient(primary_account_id, 682 service->StartRequestForClient(primary_account_id,
657 app_client_id, 683 app_client_id,
658 app_client_secret, 684 app_client_secret,
659 OAuth2TokenService::ScopeSet(), 685 OAuth2TokenService::ScopeSet(),
660 this); 686 this);
661 return; 687 return;
662 } 688 }
663 } 689 }
664 #endif 690 #endif
665 login_token_request_ = service->StartRequest( 691 login_token_request_ = service->StartRequest(
666 primary_account_id, OAuth2TokenService::ScopeSet(), this); 692 token_key_->account_id, OAuth2TokenService::ScopeSet(), this);
667 } 693 }
668 694
669 void IdentityGetAuthTokenFunction::StartGaiaRequest( 695 void IdentityGetAuthTokenFunction::StartGaiaRequest(
670 const std::string& login_access_token) { 696 const std::string& login_access_token) {
671 DCHECK(!login_access_token.empty()); 697 DCHECK(!login_access_token.empty());
672 mint_token_flow_.reset(CreateMintTokenFlow(login_access_token)); 698 mint_token_flow_.reset(CreateMintTokenFlow(login_access_token));
673 mint_token_flow_->Start(); 699 mint_token_flow_->Start();
674 } 700 }
675 701
676 void IdentityGetAuthTokenFunction::ShowLoginPopup() { 702 void IdentityGetAuthTokenFunction::ShowLoginPopup() {
677 signin_flow_.reset(new IdentitySigninFlow(this, GetProfile())); 703 signin_flow_.reset(new IdentitySigninFlow(this, GetProfile()));
678 signin_flow_->Start(); 704 signin_flow_->Start();
679 } 705 }
680 706
681 void IdentityGetAuthTokenFunction::ShowOAuthApprovalDialog( 707 void IdentityGetAuthTokenFunction::ShowOAuthApprovalDialog(
682 const IssueAdviceInfo& issue_advice) { 708 const IssueAdviceInfo& issue_advice) {
683 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(GetExtension()); 709 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(GetExtension());
684 const std::string locale = g_browser_process->local_state()->GetString( 710 const std::string locale = g_browser_process->local_state()->GetString(
685 prefs::kApplicationLocale); 711 prefs::kApplicationLocale);
686 712
687 gaia_web_auth_flow_.reset(new GaiaWebAuthFlow( 713 gaia_web_auth_flow_.reset(new GaiaWebAuthFlow(this,
688 this, GetProfile(), GetExtension()->id(), oauth2_info, locale)); 714 GetProfile(),
715 token_key_->account_id,
716 GetExtension()->id(),
717 oauth2_info,
718 locale));
689 gaia_web_auth_flow_->Start(); 719 gaia_web_auth_flow_->Start();
690 } 720 }
691 721
692 OAuth2MintTokenFlow* IdentityGetAuthTokenFunction::CreateMintTokenFlow( 722 OAuth2MintTokenFlow* IdentityGetAuthTokenFunction::CreateMintTokenFlow(
693 const std::string& login_access_token) { 723 const std::string& login_access_token) {
694 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(GetExtension()); 724 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(GetExtension());
695 725
696 OAuth2MintTokenFlow* mint_token_flow = new OAuth2MintTokenFlow( 726 OAuth2MintTokenFlow* mint_token_flow = new OAuth2MintTokenFlow(
697 GetProfile()->GetRequestContext(), 727 GetProfile()->GetRequestContext(),
698 this, 728 this,
699 OAuth2MintTokenFlow::Parameters(login_access_token, 729 OAuth2MintTokenFlow::Parameters(login_access_token,
700 GetExtension()->id(), 730 GetExtension()->id(),
701 oauth2_client_id_, 731 oauth2_client_id_,
702 oauth2_info.scopes, 732 oauth2_info.scopes,
703 gaia_mint_token_mode_)); 733 gaia_mint_token_mode_));
704 return mint_token_flow; 734 return mint_token_flow;
705 } 735 }
706 736
707 bool IdentityGetAuthTokenFunction::HasLoginToken() const { 737 bool IdentityGetAuthTokenFunction::HasLoginToken() const {
708 ProfileOAuth2TokenService* token_service = 738 ProfileOAuth2TokenService* token_service =
709 ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile()); 739 ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile());
710 return token_service->RefreshTokenIsAvailable( 740 return token_service->RefreshTokenIsAvailable(token_key_->account_id);
711 GetPrimaryAccountId(GetProfile()));
712 } 741 }
713 742
714 std::string IdentityGetAuthTokenFunction::MapOAuth2ErrorToDescription( 743 std::string IdentityGetAuthTokenFunction::MapOAuth2ErrorToDescription(
715 const std::string& error) { 744 const std::string& error) {
716 const char kOAuth2ErrorAccessDenied[] = "access_denied"; 745 const char kOAuth2ErrorAccessDenied[] = "access_denied";
717 const char kOAuth2ErrorInvalidScope[] = "invalid_scope"; 746 const char kOAuth2ErrorInvalidScope[] = "invalid_scope";
718 747
719 if (error == kOAuth2ErrorAccessDenied) 748 if (error == kOAuth2ErrorAccessDenied)
720 return std::string(identity_constants::kUserRejected); 749 return std::string(identity_constants::kUserRejected);
721 else if (error == kOAuth2ErrorInvalidScope) 750 else if (error == kOAuth2ErrorInvalidScope)
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
828 void IdentityLaunchWebAuthFlowFunction::OnAuthFlowURLChange( 857 void IdentityLaunchWebAuthFlowFunction::OnAuthFlowURLChange(
829 const GURL& redirect_url) { 858 const GURL& redirect_url) {
830 if (redirect_url.GetWithEmptyPath() == final_url_prefix_) { 859 if (redirect_url.GetWithEmptyPath() == final_url_prefix_) {
831 SetResult(new base::StringValue(redirect_url.spec())); 860 SetResult(new base::StringValue(redirect_url.spec()));
832 SendResponse(true); 861 SendResponse(true);
833 Release(); // Balanced in RunAsync. 862 Release(); // Balanced in RunAsync.
834 } 863 }
835 } 864 }
836 865
837 } // namespace extensions 866 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698