Twitter将我的应用程序列入白名单,以便我可以检索用户电子邮件,但仍然没有获得它?

时间:2016-06-23 19:14:56

标签: twitter-oauth auth0

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

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

Twitter email whitelist so I can get user emails

React Native Lock代码主要来自示例应用:

React Native Lock Code

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

enter image description here

2 个答案:

答案 0 :(得分:2)

截至今天August 3rd 2016,似乎将社交提供商个人资料信息从Twitter映射到Auth0规范化用户个人资料的Auth0策略不包含email属性的映射。

不要相信这与您提供的React NativeLockscope信息有关(尽管您不需要明确输入{{1}因为你已经宣布了email,它可以为你提供一切)。

您可以转到Auth0信息中心,然后选择profile然后点击Connections -> Social -> Twitter按钮重现信息。

屏幕截图如下:

enter image description here

结果:

enter image description here

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

例如,您可以使用Auth0规则(在Try下的信息中心上提供)。见下面的截图:

enter image description here

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

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