【问题标题】:Google Auth User Email Not PresentGoogle Auth 用户电子邮件不存在
【发布时间】:2013-07-19 14:19:19
【问题描述】:

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

                            });
                        });

                    }
                });

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

【问题讨论】:

    标签: javascript google-plus google-authentication


    【解决方案1】:

    虽然 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

    【讨论】:

      【解决方案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);
              }
      }
      

      【讨论】:

        【解决方案3】:

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

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

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

        Full example

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-13
          • 2015-05-27
          • 2016-08-10
          • 1970-01-01
          • 2017-03-30
          • 1970-01-01
          • 2010-10-29
          • 1970-01-01
          相关资源
          最近更新 更多