Как использовать переменную сессии req.user в стратегии passport-twitter
Как я могу использовать req.user
получить авторизованного пользователя по любому из маршрутов, передав:
passport.authenticate("jwt", { session: false })
Я хочу, чтобы пользователь мог войти в систему с помощью твиттера, отличного от локального, поэтому у меня есть стратегия passport-twitter в API node.js. Как я могу получить доступ локально вошедшего в систему пользователя с req.user?
module.exports = passport => {
passport.use(
new Strategy({
consumerKey: "",
consumerSecret: "",
callbackURL: "http://localhost:3000"
},
function(token, tokenSecret, profile, cb) {
Profile.findOne({
user: req.user._id
}).then(
userdetail => {
userdetail.twuser = profile._json.screen_name;
userdetail.token = token;
userdetail.tokenSecret = tokenSecret;
userdetail.save().then();
return cb(null, profile);
}
)
}
)
);
};
2 ответа
Прежде всего, я бы проверил, есть ли уже пользователь в вашей системе с данным идентификатором профиля в твиттере. Тогда я бы проверил, есть ли пользователь с таким же адресом электронной почты. Это означает, что пользователь уже подписался на свою электронную почту. Если в вашей базе данных нет пользователя с указанным адресом электронной почты или идентификатором Twitter, создайте нового и назначьте идентификатор Twitter и адрес электронной почты для этого профиля.
Не забудьте добавить в стратегию опции includeEmail:
TwitterStrategy({
consumerKey: "",
consumerSecret: "",
callbackURL: "http://localhost:3000"
includeEmail: true, // <======= this
}
)
Обратный вызов твиттера oauth может выглядеть так:
async (token, tokenSecret, profile, cb) => {
const existingProfileWithTwitterId = await Profile.findOne({ twid: profile.id }
if (existingProfileWithTwitterId) {
return callback(null, profile)
}
const existingProfileWithEmail = await Profile.findOne({ email: profile.emails[0].value }
if (existingProfileWithEmail) {
existingProfileWithEmail.twid = profile.id
// Add some more stuff from twitter profile if you want
await existingProfileWithEmail.save()
return callback(null, existingProfileWithEmail)
}
// Create a new Profile
const profile = new Profile({
twid: profile.id,
// add some more properties
})
return callback(null, profile)
})
После этого вы можете получить доступ к профилю пользователя в следующем промежуточном программном обеспечении с помощью req.user.
Стратегия Google Passport предоставляет возможность передать запрос verify
Перезвоните. Кажется, это именно то, что мы ищем. Этот ответ на стекопоток на аналогичный вопрос указал на него, но специально для этой стратегии. Пример ниже скопирован из этого ответа.
passport.use(new GoogleStrategy({
clientID: process.env.GOOGLE_CLIENTID,
clientSecret: process.env.GOOGLE_CLIENTSECRET,
callbackURL: "http://127.0.0.1:7777/google/callback",
passReqToCallback: true
},
// google will send back the token and profile
function(req, token, refreshToken, profile, done) {
// req.user is the currently logged-in user
…
})
Этот комментарий в passport-twitter
Github repo предполагает, что опция доступна и для этой стратегии. Я еще не подтвердил, так как я не реализовал Twitter как стратегию OAuth в своем собственном проекте.