Как диагностировать passport.authenticate? - PullRequest
0 голосов
/ 12 октября 2018

Поскольку функция не имеет возвращаемого значения - как я могу определить причину сбоя функции.У меня есть следующий код:

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 голосов
/ 21 октября 2018

Рабочий процесс аутентификации, такой как этот (oauth / openid), состоит из нескольких шагов.

  1. перенаправить пользователя в службу аутентификации Google

  2. googleаутентифицирует пользователя и запрашивает подтверждение у пользователя, чтобы принять / отклонить ваш сервис

  3. , если пользователь принимает, Google перенаправляет пользователя обратно на URI обратного вызова вашего сервиса с кодом доступа.

  4. ваш сервер (не браузер пользователя) запрашивает токен доступа / обновления на серверах Google с использованием идентификатора и секретного кода вашего приложения (которые были получены от Google при регистрации приложения) и кода доступа, полученного ранее.

  5. если все хорошо, Google выдаст токен доступа / обновления для вашей службы, который вам нужно будет связать с пользователем на вашей стороне (либо существующим пользователем, использующим этот идентификатор Google, либо создайтеновый пользователь, как при регистрации, или связанный с уже зарегистрированным пользователем, как при подключении к учетной записи).

Для проверки того, что происходитn, вы можете проверить каждый шаг на вашей стороне:

Это просто перенаправит вашего пользователя в службу аутентификации 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);
      });
  }
));

Надеюсь, это поможет.

0 голосов
/ 14 октября 2018

Может быть с пользовательским обратным вызовом.( Из документации. )

В этом примере обратите внимание, что 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);
});
...