护照身份验证回调挂起

Passport authentication callback hangs

本文关键字:挂起 回调 身份验证      更新时间:2023-09-26

几个小时后,我试图自己解决这个问题,我来到SO社区寻找一些光明。

我使用护照进行用户身份验证。它已经在我的主express.js文件中初始化了,按照docs:

app.use(passport.initialize());

我得到了一个index.js文件,以这种方式处理facebook-passport:Index.js

'use strict';
import express from 'express';
import passport from 'passport';
import auth from '../auth.service';
let router = express.Router();
//this function is defined in the auth.service import but copied it here in case it's needed (the `signToken` is also defined in the service)
function setTokenCookie(req, res) {
  if (!req.user) return res.json(404, { message: 'Something went wrong, please try again.'});
  var token = signToken(req.user._id, req.user.role);
  res.cookie('token', JSON.stringify(token));
  res.redirect('/');
}

router
  .get('/', passport.authenticate('facebook', {
    scope: ['email', 'user_about_me'],
    failureRedirect: '/login'
  }))
.get('/callback', passport.authenticate('facebook', {
  successRedirect: '/',
  failureRedirect: '/login'
}), setTokenCookie);
module.exports = router;

以及在index.js中以这种方式导入的passport.js:

passport.js

import passport from 'passport';
import {
  Strategy as FacebookStrategy
}
from 'passport-facebook';
exports.setup = function(User, config) {
  passport.use(new FacebookStrategy({
      clientID: config.facebook.clientID,
      clientSecret: config.facebook.clientSecret,
      callbackURL: config.facebook.callbackURL
    },
    function(accessToken, refreshToken, profile, done) {
      User.findOne({
        'facebook.id': profile.id
      }, (findErr, user) => {
        if (findErr) {
          return done(findErr);
        }
        if (!user) {
          let userToSave = new User({
            name: profile.displayName,
            email: profile.emails[0].value,
            role: 'user',
            username: profile.username,
            provider: 'facebook',
            facebook: profile._json
          });
          userToSave.save((saveErr) => {
            if (saveErr) done(saveErr);
            return done(null, user);
          });
        } else {
          return done(null, user);
        }
      });
    }
  ));
};

这是当前发生的:

  • 提示Facebook登录
  • 在Facebook中验证成功后,回调(/auth/Facebook/callback)与预期的用户信息和令牌到达。
  • 用户被保存在DB中,并带有预期的字段

奇怪的地方:

  • 保存用户后,done(null,user)不做任何操作。应用挂起回调,客户端继续等待响应。
  • 中间件setTokenCookie永远不会被调用,所以问题肯定在前一步。

我试过了:

  • passport.js的整个设置函数封装在一个进程中。
  • 使用猫鼬与User.findOne({...}).exec().then(user => {...})的承诺

如果你需要更多的信息,请不要犹豫,尽管问。非常感谢您的帮助。

谢谢!

我在浏览代码时发现了一些可能缺失的部分。您是否使用passport.session()中间件?还有serializeUserdeserializeUser功能?

passport.serializeUser(function(user, done) {
  //place user's id in cookie
  done(null, user.id);
});
passport.deserializeUser(function(id, done) {
  //retrieve user from database by id
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

如果你像我一样是护照/快递的新手,这可能会有所帮助:

检查是否在护照逻辑中调用了done():

passport.use(new twitchStrategy({
    clientID: config.twitchID,
    clientSecret: config.twitchSecret,
    /*to be updated*/
    callbackURL: config.callbackURL,
    scope: "user_read"
  },
  function(accessToken, refreshToken, profile, done) {
    console.log(profile);
    ***return done();***
  }
));