通过LinkedIn登录

时间:2016-01-12 07:55:44

标签: node.js express login linkedin passport.js

我在Passport中构建了一个登录系统并且运行良好。现在,我想在我的系统中集成LinkedIn登录。我已登录需要clientIDclientSecret等。这是在按下LinkedIn登录按钮时调用的代码。

passport.use('linkedin', new OAuth2Strategy({
    authorizationURL: 'https://www.linkedin.com/uas/oauth2/authorization',
    tokenURL: 'https://www.linkedin.com/uas/oauth2/accessToken',
    clientID: clientid,
    clientSecret: clientsecret,
    callbackURL: '/linkedinLogin/linkedinCallbackUrlLogin',
    passReqToCallback: true
},
function(req,accessToken, refreshToken, profile, done) {
    console.log('authenticated');
    console.log(accessToken);
    req.session.code = accessToken;
    process.nextTick(function () {
        done(null, {
            code : req.code
        });
    });
}));

回调函数中的console.log()个调用都被成功触发,这意味着我已成功通过LinkedIn登录,并且我收到了访问令牌。我与LinkedIn连接的部分是正确的,我缺少的是我实际登录用户的部分。如您所见,callbackURL指向/linkedinLogin/linkedinCallbackUrlLogin。这就是我在那条路上所做的事情:

app.get('/linkedinLogin/linkedinCallbackUrlLogin', passport.authenticate('linkedin', {
    session: false,
    successRedirect:'/linkedinLogin/success',
    failureRedirect:'/linkedinLogin/fail'
}));

我只需指定successRedirectfailureRedirect。请注意,如果我将session : true作为错误Failed to serialize user into session收到,那么现在我将其保持为假。

成功调用了successRedirect。在该路线中,我向LinkedIn发出GET请求,以访问有关该用户的一些数据。我想将这些数据存储在我的数据库中并记住登录的用户。这就是我的工作方式:

https.get(
    {
    host: 'api.linkedin.com' ,
    path: '/v1/people/~?format=json' ,
    port:443 ,
    headers : {'Authorization': ' Bearer ' + req.session.code}
    },
    function(myres) {
        myres.on("data", function(chunk) {
            var linkedinJsonResult = JSON.parse(chunk);
            User.findOne({linkedinLogin : linkedinJsonResult.id}, function(err, userSearchResult){
                if(err) {
                    throw err;
                }

                //user found, login
                if(userSearchResult){
                    console.log(userSearchResult);
                }
                else {
                    //create user
                    var newUser = new User(
                        {
                            url : linkedinJsonResult.siteStandardProfileRequest.url,
                            name : linkedinJsonResult.firstName + " " + linkedinJsonResult.lastName,
                            linkedinLogin : linkedinJsonResult.id,
                            regDate : new Date()
                        }
                    );

                    //save user
                    newUser.save(function(err, user){
                        if(err){
                            throw err;
                        }

                        //login
                        console.log(user);
                    });
                }

            });
    });
    }
);

让我解释那里的代码。在获取用户的数据后,我检查收到的字段“id”。如果此id与存储在数据库中的我的用户linkedinLogin字段之一匹配,我认为它已经注册(用户已在数据库中找到),因此我必须将他/她登录。否则我只是创建使用从GET请求收到的数据的新用户。

我的问题是,在这两种情况下 - 用户都在我的数据库中找到,或者用户必须被创建 - 如果我的用户与我的网站进行交互,我怎样才能将req.user设置为我的用户?仅req.user = userSearchResult(如果找到用户,在if语句中)或req.user = user(如果用户已创建,在newUser.save()回调中)就足够了,或者我应该拨打一些为我设置的护照功能?

与未使用LinkedIn登录的用户注册和登录相关的所有其他护照功能都正常。我只是担心这个LinkedIn登录使用护照。

谢谢。

1 个答案:

答案 0 :(得分:1)

passport.js会自动将req.user对象设置为您将传递的对象,作为策略回调的done函数的第二个参数。

这意味着你应该这样做:

function(req,accessToken, refreshToken, profile, done) {
    console.log('authenticated');
    console.log(accessToken);
    req.session.code = accessToken;
    process.nextTick(function () {
        // retrieve your user here
        getOrCreateUser(profile, function(err, user){
            if(err) return done(err);
            done(null, user);
        })

    });
}));

我希望这会有所帮助。