【问题标题】:Twitter whitelisted my application so I can retrieve user email, but still not getting it?Twitter 将我的应用程序列入白名单,这样我就可以检索用户电子邮件,但仍然没有收到?
【发布时间】:2016-10-26 06:44:25
【问题描述】:

我正在使用 Auth0React Native Lock(由 Auth0 创建和维护)通过 Google、Facebook 和 Twitter 对用户进行身份验证。尽管我的应用程序被 Twitter 列入白名单并调整了我的 Twitter 应用程序权限以请求电子邮件,但在 Twitter 用户进行身份验证后,我没有收到原始 JSON 格式的电子邮件。为什么?

Twitter 将检索电子邮件的权限列入白名单:

大部分来自示例应用的 React Native Lock 代码:

通过 Twitter 登录后,这是来自 Auth0 仪表板的原始 JSON 屏幕截图。没有 Twitter 电子邮件。

【问题讨论】:

    标签: twitter-oauth auth0


    【解决方案1】:

    基于https://github.com/auth0/rules/blob/master/rules/get-twitter-email.md

    我让它与以下内容一起工作,

        function(user, context, callback) {
      // NOTE: For this rule to work, your Twitter application must be whitelisted to access email addresses.
      // See: https://dev.twitter.com/rest/reference/get/account/verify_credentials
      //
      // If Twitter does not return an email address, this rule will cause authentication to fail.
      // This might not be the desired behavior, so make sure to adapt it to your requirements.
      //
      // Remember to set the TWITTER_CONSUMER_KEY and TWITTER_CONSUMER_SECRET configuration variables.
    
      var request = require('request');
      var oauth = require('oauth-sign');
    
      if (context.connectionStrategy !== 'twitter') {
        return callback(null, user, context);
      }
    
      var url = 'https://api.twitter.com/1.1/account/verify_credentials.json';
      var params = {
        include_email: true,
        oauth_consumer_key: configuration.TWITTER_CONSUMER_KEY,
        oauth_nonce: require('uuid').v4().replace(/-/g, ''),
        oauth_signature_method: 'HMAC-SHA1',
        oauth_timestamp: Date.now() / 1000 | 0,
        oauth_token: user.identities[0].access_token,
        oauth_version: '1.0',
      };
    
      params.oauth_signature = oauth.hmacsign(
          'GET',
          url,
          params,
          configuration.TWITTER_CONSUMER_SECRET,
          user.identities[0].access_token_secret
      );
    
      var auth = Object.keys(params).sort().map(function(k) {
        return k + '="' + oauth.rfc3986(params[k]) + '"';
      }).join(', ');
    
      request({
        url: url + '?include_email=true',
        headers: {
          'Authorization': 'OAuth ' + auth
        }
      }, function(err, resp, body) {
        if (err || resp.statusCode !== 200) {
          return callback(new Error('Error retrieving email from twitter: ' + body || err));
        }
        var result;
        try {
          result = JSON.parse(body);
        } catch (e) {
          return callback(new Error('Invalid JSON returned by Twitter'));
        }
        if (!result.email) {
          // Might not want to fail in this case
          return callback(new Error('Twitter did not return an email address'));
        } else {
          user.email = result.email;
          user.app_metadata = user.app_metadata || {};
          // update the app_metadata that will be part of the response
          user.app_metadata.social_email = user.email;
    
          // persist the app_metadata update
          auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
          .then(function(){
            callback(null, user, context);
          })
          .catch(function(err){
            callback(err);
          });
    
          return callback(null, user, context);
        }
      });
    }
    

    【讨论】:

      【解决方案2】:

      截至今天,August 3rd 2016,将社交提供者配置文件信息从 Twitter 映射到 Auth0 规范化用户配置文件的 Auth0 策略似乎不包含 email 属性的映射。

      不要相信这与您提供的React NativeLockscope 信息有任何关系(尽管您不需要显式输入email,因为您已经声明了profile它给了你一切)。

      您可以通过转到 Auth0 仪表板并选择 Connections -> Social -> Twitter 然后点击 Try 按钮来重现它。

      以下截图:

      结果:

      未提供电子邮件。相信这是一个有意识的选择(而不是错误),特定于使用 Auth0 的 Twitter 社交连接使用,因为 twitter 要求您在登录后提出额外请求才能获得电子邮件。

      例如,您可以使用 Auth0 规则(在仪表板上的 Rules -> Create Rule 下可用)。请看下面的截图:

      注意:要使此规则生效,您的 Twitter 应用程序必须被列入白名单才能访问电子邮件地址。有关详细信息,请参阅与此规则相关的文档。

      【讨论】:

      • 如果这是一个有意识的选择,我不明白为什么他们有一个专门用于获取 Twitter 电子邮件的示例规则。见github.com/auth0/rules/blob/master/rules/get-twitter-email.md
      • @nomad 我写了这条规则——这主要是 Auth0 不将电子邮件作为核心配置文件的一部分返回的解决方法。这是因为 Twitter 在身份验证后需要额外的请求来获取用户的电子邮件(它不会作为常规用户配置文件的一部分返回)。正如该规则中的 cmets 所述,电子邮件将由应用程序返回,但不会作为 Auth0 用户配置文件的一部分保留。
      • @nomad - 请您检查以上内容,如果同意,则将答案标记为正确:)
      • @nomad - 有另一个用户问同样的问题 - 如果您同意,请您将此答案标记为正确吗?这将帮助类似的用户确定正确的答案。
      • 这根本不正确。 Auth0 有一条专门用于获取 Twitter 电子邮件的规则,因此您的帖子具有误导性。 github.com/auth0/rules/blob/master/rules/get-twitter-email.md
      猜你喜欢
      • 1970-01-01
      • 2015-12-21
      • 2015-08-01
      • 2015-07-17
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      相关资源
      最近更新 更多