使用passportJS从linkedin获取个人资料详细信息

时间:2014-04-26 11:46:01

标签: passport.js

我正在使用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

1 个答案:

答案 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%$的回调。