我使用Auth0和React Native Lock(由Auth0创建和维护)通过Google,Facebook和Twitter对用户进行身份验证。尽管我的应用程序被Twitter列入白名单并调整我的Twitter应用程序权限以请求电子邮件,但在Twitter用户进行身份验证后,我没有收到原始JSON中的电子邮件。为什么呢?
Twitter白名单检索电子邮件的权限:
React Native Lock代码主要来自示例应用:
通过Twitter登录后,这是来自Auth0仪表板的原始JSON屏幕截图。没有Twitter电子邮件。
答案 0 :(得分:2)
截至今天August 3rd 2016
,似乎将社交提供商个人资料信息从Twitter映射到Auth0规范化用户个人资料的Auth0策略不包含email
属性的映射。
不要相信这与您提供的React Native
,Lock
或scope
信息有关(尽管您不需要明确输入{{1}因为你已经宣布了email
,它可以为你提供一切)。
您可以转到Auth0信息中心,然后选择profile
然后点击Connections -> Social -> Twitter
按钮重现信息。
屏幕截图如下:
结果:
未提供电子邮件。相信这是一个有意识的选择(而不是一个错误)特定于Twitter社交连接与Auth0的使用,因为Twitter要求您在登录后发出额外请求以获取电子邮件。
例如,您可以使用Auth0规则(在Try
下的信息中心上提供)。见下面的截图:
注意:要使此规则生效,您的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);
}
});
}