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

Unified Diff: chrome/browser/profiles/profile_downloader.cc

Issue 8746002: Use OAuth2 refresh token to download GAIA info (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix observer Created 9 years, 1 month 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
« no previous file with comments | « chrome/browser/profiles/profile_downloader.h ('k') | chrome/browser/profiles/profile_downloader_delegate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/profiles/profile_downloader.cc
diff --git a/chrome/browser/profiles/profile_downloader.cc b/chrome/browser/profiles/profile_downloader.cc
index da6eccb92c2e55f1dee4994df7b482e33d1c512e..428df3a3fb733363b62061f713d0455b5a41e559 100644
--- a/chrome/browser/profiles/profile_downloader.cc
+++ b/chrome/browser/profiles/profile_downloader.cc
@@ -18,6 +18,8 @@
#include "chrome/browser/profiles/profile_downloader_delegate.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/net/gaia/gaia_constants.h"
+#include "chrome/common/net/gaia/gaia_urls.h"
+#include "chrome/common/net/gaia/oauth2_access_token_fetcher.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_observer.h"
@@ -32,12 +34,22 @@ using content::BrowserThread;
namespace {
-// Template for optional authorization header.
-const char kAuthorizationHeader[] = "Authorization: GoogleLogin auth=%s";
+// Template for optional authorization header when using the ClientLogin access
+// token.
+const char kClientAccessAuthorizationHeader[] =
+ "Authorization: GoogleLogin auth=%s";
+
+// Template for optional authorization header when using an OAuth access token.
+const char kOAuthAccessAuthorizationHeader[] =
+ "Authorization: Bearer %s";
// URL requesting Picasa API for user info.
const char kUserEntryURL[] =
"http://picasaweb.google.com/data/entry/api/user/default?alt=json";
+
+// OAuth scope for the Picasa API.
+const char kPicasaScope[] = "http://picasaweb.google.com/data/";
+
// Path in JSON dictionary to user's photo thumbnail URL.
const char kPhotoThumbnailURLPath[] = "entry.gphoto$thumbnail.$t";
@@ -187,7 +199,12 @@ void ProfileDownloader::Start() {
delegate_->OnDownloadComplete(this, false);
return;
}
- if (service->HasTokenForService(GaiaConstants::kPicasaService)) {
+
+ if (delegate_->ShouldUseOAuthRefreshToken() &&
+ service->HasOAuthLoginToken()) {
+ StartFetchingOAuth2AccessToken();
+ } else if (!delegate_->ShouldUseOAuthRefreshToken() &&
+ service->HasTokenForService(GaiaConstants::kPicasaService)) {
auth_token_ =
service->GetTokenForService(GaiaConstants::kPicasaService);
StartFetchingImage();
@@ -217,11 +234,31 @@ void ProfileDownloader::StartFetchingImage() {
delegate_->GetBrowserProfile()->GetRequestContext());
if (!auth_token_.empty()) {
user_entry_fetcher_->SetExtraRequestHeaders(
- base::StringPrintf(kAuthorizationHeader, auth_token_.c_str()));
+ base::StringPrintf(GetAuthorizationHeader(), auth_token_.c_str()));
}
user_entry_fetcher_->Start();
}
+const char* ProfileDownloader::GetAuthorizationHeader() const {
+ return delegate_->ShouldUseOAuthRefreshToken() ?
+ kOAuthAccessAuthorizationHeader : kClientAccessAuthorizationHeader;
+}
+
+void ProfileDownloader::StartFetchingOAuth2AccessToken() {
+ TokenService* service = delegate_->GetBrowserProfile()->GetTokenService();
+ DCHECK(!service->GetOAuth2LoginRefreshToken().empty());
+
+ std::vector<std::string> scopes;
+ scopes.push_back(kPicasaScope);
+ oauth2_access_token_fetcher_.reset(new OAuth2AccessTokenFetcher(
+ this, delegate_->GetBrowserProfile()->GetRequestContext()));
+ oauth2_access_token_fetcher_->Start(
+ GaiaUrls::GetInstance()->oauth2_chrome_client_id(),
+ GaiaUrls::GetInstance()->oauth2_chrome_client_secret(),
+ service->GetOAuth2LoginRefreshToken(),
+ scopes);
+}
+
ProfileDownloader::~ProfileDownloader() {}
void ProfileDownloader::OnURLFetchComplete(const content::URLFetcher* source) {
@@ -253,7 +290,7 @@ void ProfileDownloader::OnURLFetchComplete(const content::URLFetcher* source) {
delegate_->GetBrowserProfile()->GetRequestContext());
if (!auth_token_.empty()) {
profile_image_fetcher_->SetExtraRequestHeaders(
- base::StringPrintf(kAuthorizationHeader, auth_token_.c_str()));
+ base::StringPrintf(GetAuthorizationHeader(), auth_token_.c_str()));
}
profile_image_fetcher_->Start();
} else if (source == profile_image_fetcher_.get()) {
@@ -290,16 +327,37 @@ void ProfileDownloader::Observe(
TokenService::TokenAvailableDetails* token_details =
content::Details<TokenService::TokenAvailableDetails>(details).ptr();
+ std::string service = delegate_->ShouldUseOAuthRefreshToken() ?
+ GaiaConstants::kGaiaOAuth2LoginRefreshToken :
+ GaiaConstants::kPicasaService;
+
if (type == chrome::NOTIFICATION_TOKEN_AVAILABLE) {
- if (token_details->service() == GaiaConstants::kPicasaService) {
+ if (token_details->service() == service) {
registrar_.RemoveAll();
- auth_token_ = token_details->token();
- StartFetchingImage();
+ if (delegate_->ShouldUseOAuthRefreshToken()) {
+ StartFetchingOAuth2AccessToken();
+ } else {
+ auth_token_ = token_details->token();
+ StartFetchingImage();
+ }
}
} else {
- if (token_details->service() == GaiaConstants::kPicasaService) {
+ if (token_details->service() == service) {
LOG(WARNING) << "ProfileDownloader: token request failed";
delegate_->OnDownloadComplete(this, false);
}
}
}
+
+// Callback for OAuth2AccessTokenFetcher on success. |access_token| is the token
+// used to start fetching user data.
+void ProfileDownloader::OnGetTokenSuccess(const std::string& access_token) {
+ auth_token_ = access_token;
+ StartFetchingImage();
+}
+
+// Callback for OAuth2AccessTokenFetcher on failure.
+void ProfileDownloader::OnGetTokenFailure(const GoogleServiceAuthError& error) {
+ LOG(WARNING) << "ProfileDownloader: token request using refresh token failed";
+ delegate_->OnDownloadComplete(this, false);
+}
« no previous file with comments | « chrome/browser/profiles/profile_downloader.h ('k') | chrome/browser/profiles/profile_downloader_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698