我正在使用passportjs
来允许用户通过linkedin登录。
所需的结果是我将收到他们的电子邮件,姓名和姓氏
这是我的代码
exports.linkedInLogin = function( req, res, next ){
var widgetId = req.params.widgetId;
passport.use(new LinkedInStrategy({
consumerKey: conf.linkedIn.apiKey,
consumerSecret: conf.linkedIn.secretKey,
profileFields: ['id', 'first-name', 'last-name', 'email-address', 'headline'],
callbackURL: req.absoluteUrl('/backend/widgets/' + widgetId + '/login/linkedin/callback')
},
function(token, tokenSecret, profile, done) {
logger.info('linkedin logged in success',arguments);
}
));
passport.authenticate('linkedin')( req, res, next );
};
exports.linkedInLoginCallback = function( req, res ){
logger.info('linkedin login callback',req.query);
res.send(req.query);
};
我有两个问题
永远不会调用此函数 - 为什么?
function(token, tokenSecret, profile, done) {
logger.info('linkedin logged in success',arguments);
}
我该如何收到用户的电子邮件?我似乎无法在任何地方找到它。
编辑:
在阅读了另一个Q/A之后,我更改了“身份验证”。行到
passport.authenticate('linkedin', { scope: ['r_basicprofile', 'r_emailaddress'] })( req, res, next );
并将callack更改为
exports.linkedInLoginCallback = function( req, res ){
var request = require('request');
logger.info(req.query.oauth_token);
var options =
{
url: 'https://api.linkedin.com/v1/people/~/email-address',
// url: 'https://api.linkedin.com/v1/people/~',
headers: { 'x-li-format': 'json' },
qs: { oauth2_access_token: req.query.oauth_token } // or &format=json url parameter
};
request(options, function ( error, r, body ) {
logger.info('hello',error, body);
res.send( { 'query' : req.query, 'error' : error, 'body' : body} );
if ( r.statusCode != 200 ) {
return;
}
try {
logger.info(body);
}
catch (e) {
return;
}
});
// logger.info('linkedin login callback',req);
};
但我一直在Invalid access token
。
答案 0 :(得分:1)
经过一天的阅读和辅导,似乎答案比我想象的要简单得多。
有一件事我不得不改变 - 似乎我没有在问题中提及它。
映射到回调的路由。
之前,它是
app.get('/backend/widgets/:widgetId/login/linkedin/callback',controllers.widgetLogin.linkedInLoginCallback);
但似乎我只是在这里添加一个中间件
passport.authorize('linkedin')
所以现在它看起来像这个
app.get('/backend/widgets/:widgetId/login/linkedin/callback', passport.authorize('linkedin'), controllers.widgetLogin.linkedInLoginCallback);
我在req.account上获得了所需的所有信息。所以我的回调现在是
exports.linkedInLoginCallback = function( req, res ){
logger.info('linkedin login callback',req.account);
res.send(200,req.account);
};
所以所有的魔力都依赖于回调的中间件!
或者,如果路由不在您的控制之下,您可以将回调更改为以下内容:
exports.linkedInLoginCallback = function( req, res ){
passport.authorize('linkedin')(req, res, function(){
logger.info('linkedin login callback',req.account);
res.send(200,req.account);
});
};
这是我的首选药物..看起来像一个简单的函数和没有中间件cr%$的回调。