我们有用于 LinkedIn 社交登录的工作 Node.js 代码。 通过最新的更新,我们无法解决此代码的工作,这是我们当前的 Node.js 代码:
在之前的代码中,我们使用了
r_liteprofile
和 r_emailaddress
,并且成功完成了。现在我们在几天前创建了新应用程序,但无法解决这个问题。
有什么办法可以解决这个问题吗?当前错误是:“消息”:“无法获取用户配置文件”
我预计更改范围名称会起作用,因为以前的代码在旧 API v1 上成功运行,范围为
r_emailaddress
和 r_liteprofile
..
passport.use(
new linkedinStrategy(
{
clientID: process.env.LINKEDIN_CLIENT_ID,
clientSecret: process.env.LINKEDIN_CLIENT_SECRET,
callbackURL: 'http://localhost:5000/server/api/users/linkedin/callback',
scope: ['openid', 'profile', 'email']
},
async (accessToken, refreshToken, done) => {
try {
const userInfo = await linkedin.getProfile(
process.env.LINKEDIN_CLIENT_ID,
process.env.LINKEDIN_CLIENT_SECRET,
accessToken
);
console.log(userInfo)
let existingUser = await User.findOne({ email: userInfo.email });
if (existingUser) {
return done(null, existingUser);
}
const newUser = new User({
name: userInfo.name,
email: userInfo.email,
accessToken: accessToken,
refreshToken: refreshToken,
type: 'linkedin'
});
await newUser.save();
done(null, newUser);
} catch (err) {
console.log(err)
done(err, false);
}
}
)
);`
问题是 LinkedIn 不再支持范围
r_liteprofile
和 r_emailaddress
。您需要改用新范围 r_email
和 r_basicprofile
。
要修复代码,您需要将作用域数组更改为:
scope: ['openid', 'profile', 'email', 'basicprofile']
完成此更改后,您的代码应该可以再次运行。
这是具有正确范围的完整代码:
passport.use(
new linkedinStrategy(
{
clientID: process.env.LINKEDIN_CLIENT_ID,
clientSecret: process.env.LINKEDIN_CLIENT_SECRET,
callbackURL: 'http://localhost:5000/server/api/users/linkedin/callback',
scope: ['openid', 'profile', 'email', 'basicprofile']
},
async (accessToken, refreshToken, done) => {
try {
const userInfo = await linkedin.getProfile(
process.env.LINKEDIN_CLIENT_ID,
process.env.LINKEDIN_CLIENT_SECRET,
accessToken
);
console.log(userInfo)
let existingUser = await User.findOne({ email: userInfo.email });
if (existingUser) {
return done(null, existingUser);
}
const newUser = new User({
name: userInfo.name,
email: userInfo.email,
accessToken: accessToken,
refreshToken: refreshToken,
type: 'linkedin'
});
await newUser.save();
done(null, newUser);
} catch (err) {
console.log(err)
done(err, false);
}
}
)
);