Google Auth用户电子邮件不存在

时间:2013-07-19 14:19:19

标签: javascript google-plus google-authentication

我正在使用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);

                            });
                        });

                    }
                });

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

3 个答案:

答案 0 :(得分: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);
    });
  });

有关相关问题,请参阅How can I get the user's email address in google apps?Why can't I retrieve the users email from Google Plus API after getting permission;有关官方文档的详细信息,请参见https://developers.google.com/accounts/docs/OAuth2

答案 1 :(得分: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范围替换为您的范围,但请保留“电子邮件”。

      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);
        }
}

答案 2 :(得分:0)

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

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

简而言之:发送电子邮件'而不是&ttps://www.googleapis.com/auth/userinfo.email'对于您的范围,G +电子邮件将作为“电子邮件”的第一个条目包含在内。 “人物”中的财产反对你的对象。在链接中描述的一个选项显然是将其从ID令牌中拉出来,在上面的链接中引用。

Full example