diff options
Diffstat (limited to 'google_apis/gaia/gaia_oauth_client.cc')
-rw-r--r-- | google_apis/gaia/gaia_oauth_client.cc | 89 |
1 files changed, 68 insertions, 21 deletions
diff --git a/google_apis/gaia/gaia_oauth_client.cc b/google_apis/gaia/gaia_oauth_client.cc index f748fdb..d00b7d24e 100644 --- a/google_apis/gaia/gaia_oauth_client.cc +++ b/google_apis/gaia/gaia_oauth_client.cc @@ -7,6 +7,7 @@ #include "base/json/json_reader.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" +#include "base/string_util.h" #include "base/values.h" #include "google_apis/gaia/gaia_urls.h" #include "googleurl/src/gurl.h" @@ -24,17 +25,19 @@ const char kExpiresInValue[] = "expires_in"; namespace gaia { +// Use a non-zero number, so unit tests can differentiate the URLFetcher used by +// this class from other fetchers (most other code just hardcodes the ID to 0). +const int GaiaOAuthClient::kUrlFetcherId = 17109006; + class GaiaOAuthClient::Core : public base::RefCountedThreadSafe<GaiaOAuthClient::Core>, public net::URLFetcherDelegate { public: - Core(const std::string& gaia_url, - net::URLRequestContextGetter* request_context_getter) - : gaia_url_(gaia_url), - num_retries_(0), - request_context_getter_(request_context_getter), - delegate_(NULL), - request_type_(NO_PENDING_REQUEST) { + Core(net::URLRequestContextGetter* request_context_getter) + : num_retries_(0), + request_context_getter_(request_context_getter), + delegate_(NULL), + request_type_(NO_PENDING_REQUEST) { } void GetTokensFromAuthCode(const OAuthClientInfo& oauth_client_info, @@ -43,9 +46,13 @@ class GaiaOAuthClient::Core GaiaOAuthClient::Delegate* delegate); void RefreshToken(const OAuthClientInfo& oauth_client_info, const std::string& refresh_token, + const std::vector<std::string>& scopes, int max_retries, GaiaOAuthClient::Delegate* delegate); void GetUserInfo(const std::string& oauth_access_token, + int max_retries, + Delegate* delegate); + void GetTokenInfo(const std::string& oauth_access_token, int max_retries, Delegate* delegate); @@ -59,18 +66,19 @@ class GaiaOAuthClient::Core NO_PENDING_REQUEST, TOKENS_FROM_AUTH_CODE, REFRESH_TOKEN, + TOKEN_INFO, USER_INFO, }; virtual ~Core() {} - void MakeGaiaRequest(const std::string& post_body, + void MakeGaiaRequest(const GURL& url, + const std::string& post_body, int max_retries, GaiaOAuthClient::Delegate* delegate); void HandleResponse(const net::URLFetcher* source, bool* should_retry_request); - GURL gaia_url_; int num_retries_; scoped_refptr<net::URLRequestContextGetter> request_context_getter_; GaiaOAuthClient::Delegate* delegate_; @@ -94,12 +102,14 @@ void GaiaOAuthClient::Core::GetTokensFromAuthCode( "&redirect_uri=" + net::EscapeUrlEncodedData(oauth_client_info.redirect_uri, true) + "&grant_type=authorization_code"; - MakeGaiaRequest(post_body, max_retries, delegate); + MakeGaiaRequest(GURL(GaiaUrls::GetInstance()->oauth2_token_url()), + post_body, max_retries, delegate); } void GaiaOAuthClient::Core::RefreshToken( const OAuthClientInfo& oauth_client_info, const std::string& refresh_token, + const std::vector<std::string>& scopes, int max_retries, GaiaOAuthClient::Delegate* delegate) { DCHECK_EQ(request_type_, NO_PENDING_REQUEST); @@ -111,7 +121,14 @@ void GaiaOAuthClient::Core::RefreshToken( "&client_secret=" + net::EscapeUrlEncodedData(oauth_client_info.client_secret, true) + "&grant_type=refresh_token"; - MakeGaiaRequest(post_body, max_retries, delegate); + + if (!scopes.empty()) { + std::string scopes_string = JoinString(scopes, ' '); + post_body += "&scope=" + net::EscapeUrlEncodedData(scopes_string, true); + } + + MakeGaiaRequest(GURL(GaiaUrls::GetInstance()->oauth2_token_url()), + post_body, max_retries, delegate); } void GaiaOAuthClient::Core::GetUserInfo(const std::string& oauth_access_token, @@ -123,7 +140,7 @@ void GaiaOAuthClient::Core::GetUserInfo(const std::string& oauth_access_token, delegate_ = delegate; num_retries_ = 0; request_.reset(net::URLFetcher::Create( - 0, GURL(GaiaUrls::GetInstance()->oauth_user_info_url()), + kUrlFetcherId, GURL(GaiaUrls::GetInstance()->oauth_user_info_url()), net::URLFetcher::GET, this)); request_->SetRequestContext(request_context_getter_.get()); request_->AddExtraRequestHeader("Authorization: OAuth " + oauth_access_token); @@ -136,7 +153,22 @@ void GaiaOAuthClient::Core::GetUserInfo(const std::string& oauth_access_token, request_->Start(); } +void GaiaOAuthClient::Core::GetTokenInfo(const std::string& oauth_access_token, + int max_retries, + Delegate* delegate) { + DCHECK_EQ(request_type_, NO_PENDING_REQUEST); + DCHECK(!request_.get()); + request_type_ = TOKEN_INFO; + std::string post_body = + "access_token=" + net::EscapeUrlEncodedData(oauth_access_token, true); + MakeGaiaRequest(GURL(GaiaUrls::GetInstance()->oauth2_token_info_url()), + post_body, + max_retries, + delegate); +} + void GaiaOAuthClient::Core::MakeGaiaRequest( + const GURL& url, const std::string& post_body, int max_retries, GaiaOAuthClient::Delegate* delegate) { @@ -144,7 +176,7 @@ void GaiaOAuthClient::Core::MakeGaiaRequest( delegate_ = delegate; num_retries_ = 0; request_.reset(net::URLFetcher::Create( - 0, gaia_url_, net::URLFetcher::POST, this)); + kUrlFetcherId, url, net::URLFetcher::POST, this)); request_->SetRequestContext(request_context_getter_.get()); request_->SetUploadData("application/x-www-form-urlencoded", post_body); request_->SetMaxRetriesOn5xx(max_retries); @@ -175,7 +207,9 @@ void GaiaOAuthClient::Core::OnURLFetchComplete( void GaiaOAuthClient::Core::HandleResponse( const net::URLFetcher* source, bool* should_retry_request) { - // Keep the URLFetcher object in case we need to reuse it. + // Move ownership of the request fetcher into a local scoped_ptr which + // will be nuked when we're done handling the request, unless we need + // to retry, in which case ownership will be returned to request_. scoped_ptr<net::URLFetcher> old_request = request_.Pass(); DCHECK_EQ(source, old_request.get()); @@ -223,6 +257,11 @@ void GaiaOAuthClient::Core::HandleResponse( break; } + case TOKEN_INFO: { + delegate_->OnGetTokenInfoResponse(response_dict.Pass()); + break; + } + case TOKENS_FROM_AUTH_CODE: case REFRESH_TOKEN: { std::string access_token; @@ -252,9 +291,8 @@ void GaiaOAuthClient::Core::HandleResponse( } } -GaiaOAuthClient::GaiaOAuthClient(const std::string& gaia_url, - net::URLRequestContextGetter* context_getter) { - core_ = new Core(gaia_url, context_getter); +GaiaOAuthClient::GaiaOAuthClient(net::URLRequestContextGetter* context_getter) { + core_ = new Core(context_getter); } GaiaOAuthClient::~GaiaOAuthClient() { @@ -271,12 +309,15 @@ void GaiaOAuthClient::GetTokensFromAuthCode( delegate); } -void GaiaOAuthClient::RefreshToken(const OAuthClientInfo& oauth_client_info, - const std::string& refresh_token, - int max_retries, - Delegate* delegate) { +void GaiaOAuthClient::RefreshToken( + const OAuthClientInfo& oauth_client_info, + const std::string& refresh_token, + const std::vector<std::string>& scopes, + int max_retries, + Delegate* delegate) { return core_->RefreshToken(oauth_client_info, refresh_token, + scopes, max_retries, delegate); } @@ -287,4 +328,10 @@ void GaiaOAuthClient::GetUserInfo(const std::string& access_token, return core_->GetUserInfo(access_token, max_retries, delegate); } +void GaiaOAuthClient::GetTokenInfo(const std::string& access_token, + int max_retries, + Delegate* delegate) { + return core_->GetTokenInfo(access_token, max_retries, delegate); +} + } // namespace gaia |