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}` });