如何诊断passport.authenticate?

时间:2018-10-12 17:11:45

标签: typescript oauth-2.0 passport.js

由于该函数没有返回值-如何确定导致该函数失败的原因。我有以下代码:

function test(req : IncomingMessage, res :ServerResponse, next:(err:any)=>void) {

  passport.authenticate('google', {scope:['https://www.googleapis.com/auth/userinfo.email']})(req, res,next);

  //how do I get details here
}

我的意思是我知道它会失败,因为未调用该行中的下一个处理程序,但是我如何获得更多详细信息?

该函数的实例如下:

  export const usersRouter = express
  .Router()

.post('/googleLogin', test, async (req, res) => {
    const user: User = req.user;
    if (!user) {
      res.send(401);
    }

    // const token = getJwtToken(user._id.toHexString());
    // res.send({ token });
  })

2 个答案:

答案 0 :(得分:1)

也许带有自定义回调。 (From the documentation.

在此示例中,请注意,authenticate()是从路由处理程序中调用的,而不是用作路由中间件。这样可以通过闭包对req和res对象进行回调访问。

app.get('/googleLogin', function(req, res, next) {
  passport.authenticate('google', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

答案 1 :(得分:0)

这样的身份验证工作流程(oauth / openid)涉及几个步骤。

  1. 将用户重定向到Google的身份验证服务

  2. google对用户进行身份验证,并要求用户确认以接受/拒绝您的服务

  3. 如果用户接受google,则会使用访问代码将用户重定向回服务的回调uri。

  4. 您的服务器(而不是用户的浏览器)使用您应用的ID和密码(在注册应用时由Google发出)和之前收到的访问码来请求对Google服务器的访问/刷新令牌。

  5. 如果一切正常,则Google会向您的服务发出访问/刷新令牌,您必须将该令牌与您身边的用户(使用该google ID的现有用户,或以进行注册,或与连接帐户中已登录的用户相关联。)

为了检查发生了什么,您可以检查自己身边的每个步骤:

这只会将您的用户重定向到Google的身份验证服务

app.get('/auth/google',
      passport.authenticate('google', {
        scope: ['https://www.googleapis.com/auth/userinfo.email']
      });

您将在用户界面中使用此终结点,例如:

<a href="/auth/google">Connect with google</a>

一旦google对您的用户进行身份验证并将您的用户重定向回您的服务,这就是用户将被重定向到的端点:

app.get('/auth/google/callback',
  (req, res, next) => {
    // You can inspect google's redirection here
    return next();
  }, 
  passport.authenticate('google', { failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/');
  });

这时,护照将继续进行身份验证流程,以向Google请求访问/刷新令牌。 当您的服务器向Google请求访问/刷新令牌时,将调用策略定义的回调:

passport.use(new GoogleStrategy({
    consumerKey: GOOGLE_CONSUMER_KEY,
    consumerSecret: GOOGLE_CONSUMER_SECRET,
    callbackURL: "http://www.example.com/auth/google/callback"
  },
  function(token, tokenSecret, profile, done) {
  // you can debug google's response here (this is from your server's request)
      User.findOrCreate({ googleId: profile.id }, function (err, user) {
        return done(err, user);
      });
  }
));

希望这会有所帮助。