passport.js return error/failureFlasg 留言查看
passport.js return error/failureFlasg message to view
我刚开始使用 express 和 passport.js,但在使用护照进行身份验证时无法显示错误消息
当用户成功通过身份验证时,我可以重定向用户并且一切正常,但是,如果使用不同的策略对同一封电子邮件进行身份验证,我想显示一条消息,说明给定的电子邮件已经与不同的策略。
这是我的授权-routes.js
router.get(
'/google',
passport.authenticate('google', {scope: ['email', 'profile']})
);
router.get('/google/redirect', passport.authenticate('google', { successRedirect: '/protected/'}));
这是我的 authController.js
passport.use(
new GoogleStrategy(
{
callbackURL: cbUrl,
clientID: process.env.GOOGLE_KEY,
clientSecret: process.env.GOOGLE_SECRET
},
(accessToken, refreshToken, profile, done) => verify(profile, done, 'Google')
)
);
function verify(profile, done, provider) {
User.findOne({
email: profile.email || profile.emails[0].value
}).then((currentUser) => {
if (currentUser) {
if (currentUser.provider !== provider)
return done(null, false, {message: `Login with ${provider} failed, this account is already associated with ${currentUser.provider}` });
else
return done(null, currentUser);
} else {
new User({
name: profile.displayName,
email: profile.email || profile.emails[0].value,
userId: profile.id,
provider: provider
}).save().then((newUser) => {
return done(null, newUser);
});
}
return done('Something went wrong!');
});
}
总而言之,如果我使用 Google oauth 通过电子邮件 jhon.doe@gmail.com 注册了一个帐户,然后尝试使用 jhon.doe 登录或注册@gmail.com 但这次使用 Facebook oauth,我想 return 一条消息并在我的登录页面上显示该消息。
所以,经过一些阅读我找到了我的解决方案,如果其他人也有同样的问题,这里是解决方案。
安装这些依赖项
npm install express-session express-flash
你初始化护照的地方
app.use(flash());
app.use(
session({
secret: process.env.SESSION_KEY,
resave: false,
saveUninitialized: false
})
);
app.use(passport.initialize());
app.use(passport.session());
在我的 login.ejs
<% if (messages.error) { %>
<%= messages.error %>
<% } %>
我的授权-routes.js
router.get(
'/facebook/redirect',
passport.authenticate('facebook', {
successRedirect: '/protected/',
failureRedirect: '/auth/login' ,
failureFlash: true
})
);
最后,我的 authController.js
done(null, false, { message: `Login with ${provider} failed, this email is already associated with ${currentUser.provider}` });
我刚开始使用 express 和 passport.js,但在使用护照进行身份验证时无法显示错误消息
当用户成功通过身份验证时,我可以重定向用户并且一切正常,但是,如果使用不同的策略对同一封电子邮件进行身份验证,我想显示一条消息,说明给定的电子邮件已经与不同的策略。
这是我的授权-routes.js
router.get(
'/google',
passport.authenticate('google', {scope: ['email', 'profile']})
);
router.get('/google/redirect', passport.authenticate('google', { successRedirect: '/protected/'}));
这是我的 authController.js
passport.use(
new GoogleStrategy(
{
callbackURL: cbUrl,
clientID: process.env.GOOGLE_KEY,
clientSecret: process.env.GOOGLE_SECRET
},
(accessToken, refreshToken, profile, done) => verify(profile, done, 'Google')
)
);
function verify(profile, done, provider) {
User.findOne({
email: profile.email || profile.emails[0].value
}).then((currentUser) => {
if (currentUser) {
if (currentUser.provider !== provider)
return done(null, false, {message: `Login with ${provider} failed, this account is already associated with ${currentUser.provider}` });
else
return done(null, currentUser);
} else {
new User({
name: profile.displayName,
email: profile.email || profile.emails[0].value,
userId: profile.id,
provider: provider
}).save().then((newUser) => {
return done(null, newUser);
});
}
return done('Something went wrong!');
});
}
总而言之,如果我使用 Google oauth 通过电子邮件 jhon.doe@gmail.com 注册了一个帐户,然后尝试使用 jhon.doe 登录或注册@gmail.com 但这次使用 Facebook oauth,我想 return 一条消息并在我的登录页面上显示该消息。
所以,经过一些阅读我找到了我的解决方案,如果其他人也有同样的问题,这里是解决方案。
安装这些依赖项
npm install express-session express-flash
你初始化护照的地方
app.use(flash());
app.use(
session({
secret: process.env.SESSION_KEY,
resave: false,
saveUninitialized: false
})
);
app.use(passport.initialize());
app.use(passport.session());
在我的 login.ejs
<% if (messages.error) { %>
<%= messages.error %>
<% } %>
我的授权-routes.js
router.get(
'/facebook/redirect',
passport.authenticate('facebook', {
successRedirect: '/protected/',
failureRedirect: '/auth/login' ,
failureFlash: true
})
);
最后,我的 authController.js
done(null, false, { message: `Login with ${provider} failed, this email is already associated with ${currentUser.provider}` });