Index: google_apis/gaia/gaia_oauth_client.cc |
diff --git a/google_apis/gaia/gaia_oauth_client.cc b/google_apis/gaia/gaia_oauth_client.cc |
index 1113ff6730921c86dd0a4255c9112b37d2837423..1d5f9eb893337f22f2ec4b5fd8d2cf0f0a3f7bcc 100644 |
--- a/google_apis/gaia/gaia_oauth_client.cc |
+++ b/google_apis/gaia/gaia_oauth_client.cc |
@@ -56,6 +56,9 @@ class GaiaOAuthClient::Core |
void GetUserId(const std::string& oauth_access_token, |
int max_retries, |
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); |
@@ -73,13 +76,14 @@ class GaiaOAuthClient::Core |
TOKEN_INFO, |
USER_EMAIL, |
USER_ID, |
+ USER_INFO, |
}; |
virtual ~Core() {} |
- void GetUserInfo(const std::string& oauth_access_token, |
- int max_retries, |
- Delegate* delegate); |
+ void PeopleGet(const std::string& oauth_access_token, |
+ int max_retries, |
+ Delegate* delegate); |
void MakeGaiaRequest(const GURL& url, |
const std::string& post_body, |
int max_retries, |
@@ -145,7 +149,7 @@ void GaiaOAuthClient::Core::GetUserEmail(const std::string& oauth_access_token, |
DCHECK_EQ(request_type_, NO_PENDING_REQUEST); |
DCHECK(!request_.get()); |
request_type_ = USER_EMAIL; |
- GetUserInfo(oauth_access_token, max_retries, delegate); |
+ PeopleGet(oauth_access_token, max_retries, delegate); |
} |
void GaiaOAuthClient::Core::GetUserId(const std::string& oauth_access_token, |
@@ -154,16 +158,25 @@ void GaiaOAuthClient::Core::GetUserId(const std::string& oauth_access_token, |
DCHECK_EQ(request_type_, NO_PENDING_REQUEST); |
DCHECK(!request_.get()); |
request_type_ = USER_ID; |
- GetUserInfo(oauth_access_token, max_retries, delegate); |
+ PeopleGet(oauth_access_token, max_retries, delegate); |
} |
void GaiaOAuthClient::Core::GetUserInfo(const std::string& oauth_access_token, |
int max_retries, |
Delegate* delegate) { |
+ DCHECK_EQ(request_type_, NO_PENDING_REQUEST); |
+ DCHECK(!request_.get()); |
+ request_type_ = USER_INFO; |
+ PeopleGet(oauth_access_token, max_retries, delegate); |
+} |
+ |
+void GaiaOAuthClient::Core::PeopleGet(const std::string& oauth_access_token, |
+ int max_retries, |
+ Delegate* delegate) { |
delegate_ = delegate; |
num_retries_ = 0; |
request_.reset(net::URLFetcher::Create( |
- kUrlFetcherId, GURL(GaiaUrls::GetInstance()->oauth_user_info_url()), |
+ kUrlFetcherId, GURL(GaiaUrls::GetInstance()->people_get_url()), |
net::URLFetcher::GET, this)); |
request_->SetRequestContext(request_context_getter_.get()); |
request_->AddExtraRequestHeader("Authorization: OAuth " + oauth_access_token); |
@@ -282,9 +295,27 @@ void GaiaOAuthClient::Core::HandleResponse( |
switch (type) { |
case USER_EMAIL: { |
- std::string email; |
- response_dict->GetString("email", &email); |
- delegate_->OnGetUserEmailResponse(email); |
+ // Use first email of type "account" as the user's email. |
+ const base::ListValue* emails_list; |
+ bool email_found = false; |
+ if (response_dict->GetList("emails", &emails_list)) { |
+ for (size_t i = 0; i < emails_list->GetSize(); ++i) { |
+ const base::DictionaryValue* email_dict; |
+ if (emails_list->GetDictionary(i, &email_dict)) { |
+ std::string email; |
+ std::string type; |
+ if (email_dict->GetString("type", &type) && |
+ type == "account" && |
+ email_dict->GetString("value", &email)) { |
+ delegate_->OnGetUserEmailResponse(email); |
+ email_found = true; |
+ break; |
+ } |
+ } |
+ } |
+ } |
+ if (!email_found) |
+ delegate_->OnNetworkError(net::URLFetcher::RESPONSE_CODE_INVALID); |
break; |
} |
@@ -295,6 +326,11 @@ void GaiaOAuthClient::Core::HandleResponse( |
break; |
} |
+ case USER_INFO: { |
+ delegate_->OnGetUserInfoResponse(response_dict.Pass()); |
+ break; |
+ } |
+ |
case TOKEN_INFO: { |
delegate_->OnGetTokenInfoResponse(response_dict.Pass()); |
break; |
@@ -372,6 +408,12 @@ void GaiaOAuthClient::GetUserId(const std::string& access_token, |
return core_->GetUserId(access_token, max_retries, delegate); |
} |
+void GaiaOAuthClient::GetUserInfo(const std::string& access_token, |
+ int max_retries, |
+ Delegate* delegate) { |
+ return core_->GetUserInfo(access_token, max_retries, delegate); |
+} |
+ |
void GaiaOAuthClient::GetTokenInfo(const std::string& access_token, |
int max_retries, |
Delegate* delegate) { |