我在Passport中构建了一个登录系统并且运行良好。现在,我想在我的系统中集成LinkedIn登录。我已登录需要clientID
,clientSecret
等。这是在按下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'
}));
我只需指定successRedirect
和failureRedirect
。请注意,如果我将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登录使用护照。
谢谢。
答案 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);
})
});
}));
我希望这会有所帮助。