1

我正在为 Google Auth 2.0 使用 javascript api。我遇到了用户电子邮件未显示的问题,即使我请求https://www.googleapis.com/auth/userinfo.email也是如此。

我的代码如下所示:

gapi.auth.authorize({
                    client_id : 'xxxxxxxxxx.apps.googleusercontent.com',
                    scope : ['https://www.googleapis.com/auth/plus.me', 'https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/userinfo.profile'],
                    immediate : false
                }, function(result) {

                    if (result != null) {
                        gapi.client.load('plus', 'v1', function() {
                            var request = gapi.client.plus.people.get({
                                'userId' : 'me'
                            });
                            request.execute(function(resp) {
                                console.log(resp);

                            });
                        });

                    }
                });

我缺少什么来获取用户的电子邮件?

4

3 回答 3

4

虽然 userinfo.email 角色允许您访问信息,但 plus v1 客户端不提供它。您将需要对不同的端点进行额外的调用以获取信息。

您将需要 oauth2 v2 端点,您可以使用gapi.client.load('oauth2', 'v2', callback). 您想要的端点本身是gapi.client.oauth2.userinfo.get(). 这是未经测试的,但代码可能类似于:

  gapi.client.load('oath2','v2',function(){
    gapi.client.oauth2.userinfo.get().execute(function(resp){
      console.log(resp);
    });
  });

请参阅如何在 Google 应用中获取用户的电子邮件地址?以及为什么在获得一些相关问题的许可后,我无法从 Google Plus API 检索用户电子邮件,以及https://developers.google.com/accounts/docs/OAuth2以获取官方文档的更多详细信息。

于 2013-07-19T15:21:03.817 回答
2

我是这样做的:

function tryAuth() {
    var clientId = CLIENT_ID;

    var configString = {
        client_id: clientId,
        scope: SCOPE,
        immediate: 'false'
    };

    gapi.auth.authorize(configString, handleAuthResult);
}

在哪里 SCOPE = 'https://www.googleapis.com/auth/fusiontables email';

https://www.googleapis.com/auth/fusiontables范围替换为您的范围,但保留 'email' 。

      function handleAuthResult(authResult) {

          if (authResult && !authResult.error) {
            var access_token = authResult.access_token;
             alert('Successfully logged in.' + access_token);

            tryGetEmail(access_token);

    }

接着

function tryGetEmail(access_token) {
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.open("GET", 'https://www.googleapis.com/oauth2/v1/userinfo?access_token=' + access_token, false );

            xmlHttp.send( null );

        if(xmlHttp.status == 200) {
            var strJSON = xmlHttp.responseText;
            var objJSON = eval("(function(){return " + strJSON + ";})()");
            email = objJSON.email;
            alert('got email ' + email);
        }
}
于 2014-03-06T05:55:22.550 回答
0

不推荐使用 userinfo 端点和 oauth2 v2。较旧的答案适用于旧系统。迁移的所有细节都在这里:

https://developers.google.com/+/api/auth-migration#email

简而言之:将“电子邮件”而不是“h ttps://www.googleapis.com/auth/userinfo.email”作为您的范围,G+ 电子邮件将作为“电子邮件”属性的第一个条目包含在您正在获取的“人”对象。链接中显然还描述了一个将其从 ID 令牌中提取出来的选项,在上面的链接中引用。

完整示例

于 2015-02-13T19:29:30.780 回答