Требовать от Google возврата адреса электронной почты в составе OAuth

Я использую OAuth для доступа к Gmail с помощью dotNetOAuth. Как я могу заставить Google возвращает адрес электронной почты пользователя в рамках обратного вызова после авторизации?

по умолчанию обратный вызов Google OAuth возвращает только маркеры secret и access.

7 ответов


OAuth не предоставляет возможности для дополнительных параметров во время рукопожатия OAuth, поэтому я не думаю, что вы можете заставить Google предоставить его. Однако, скорее всего, Google API может использовать маркер доступа OAuth для вызова для получения адреса электронной почты после рукопожатия.


сначала вам нужно добавить следующую область (https://www.googleapis.com/auth/userinfo.email) на ваш запрос oauth.

после того, как вы вернулись в ваше приложение из Google и у вас есть маркер доступа, вы можете сделать запрос, используя маркер доступа https://www.googleapis.com/userinfo/email?alt=json. Это вернет адрес электронной почты. Больше информации на http://sites.google.com/site/oauthgoog/Home/emaildisplayscope


For getting the Email Id, you need to add the scope "https://wwww.googleapis.com/auth/userinfo.email"

Then you will get id_token in the response.

Response={
   "access_token" : "ya29.eAG__HY8KahJZN9VmangoliaV-Jn7hLtestkeys",
   "token_type" : "Bearer",
   "expires_in" : 3600,
   "id_token" : "id_token_from_server",
   "refresh_token" : "1/GIHTAdMo6zLVKCqNbA"
 }

Then use this id_token as below POST request:

https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=id_token_from_server

And you will get response like below:

Response={
 "issuer": "accounts.google.com",
 "issued_to": "80780.apps.googleusercontent.com",
 "audience": "8078909.apps.googleusercontent.com",
 "user_id": "1118976557884",
 "expires_in": 3598,
 "issued_at": 1456353,
 "email": "emailId@gmail.com",
 "email_verified": true
}

Make sure you add "www" in the APIs as shown above...

запрос OAuth область, чтобы включить ", напишите объем дисплея" https://www.googleapis.com/auth/userinfo.email

scope="http://www.google.com/m8/feeds/ https://www.googleapis.com/auth/userinfo.email"

затем используйте REST API, как гамак получить адрес

            RestClient client = new RestClient
            {
                Authority = "https://www.googleapis.com",
            };

            RestRequest request = new RestRequest
            {
                Path = "userinfo/email?alt=json",
                Credentials = OAuthCredentials.ForProtectedResource(
                     this.requestSettings.ConsumerKey,
                     this.requestSettings.ConsumerSecret,
                     this.requestSettings.Token,
                     this.requestSettings.TokenSecret)
            };

            var response = client.Request(request);

вот функция c#, когда вы предварительно авторизовали запрос, как описано выше:

        private void FetchUsersEmail(token)
        {
            var emailRequest = @"https://www.googleapis.com/userinfo/email?alt=json&access_token=" + token;
            // Create a request for the URL.        
            var request = WebRequest.Create(emailRequest);
            // Get the response.
            var response = (HttpWebResponse) request.GetResponse();
            // Get the stream containing content returned by the server.
            var dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            var reader = new StreamReader(dataStream);
            // Read the content. 
            var jsonString = reader.ReadToEnd();
            // Cleanup the streams and the response.
            reader.Close();
            dataStream.Close();
            response.Close();

            dynamic json = JValue.Parse(jsonString);
            var currentGoogleEmail = json.data.email;
        }

(JValue является частью JSON.Net)


в php, apiOauth2Service.класс php предоставляет методы для доступа к зарегистрированной информации пользователя. Для этого вы можете использовать метод userinfo->get (). Убедитесь, что вы также используете scope https://www.googleapis.com/auth/userinfo.email.

Это будет работать с тем же маркером доступа. Также вы должны попробовать искать в других API-интерфейсах аналогичную информацию взамен. Это намного проще посмотреть через oAuth_playground >> http://code.google.com/apis/explorer/


Если вы запрашиваете userinfo.область электронной почты, Google возвращает id_token вместе с access_token.

id_token может быть незашифрованным, чтобы предоставить адрес электронной почты пользователя, по адресу www.googleapis.com?/oauth2/v1/tokeninfo?id_token=IDTOKENHERE

дополнительная информация здесь:https://developers.google.com/accounts/docs/OAuth2Login