Почему мой запрос аутентификации Auth0 / passport возвращает ложный токен, и как мне его обработать? - PullRequest
0 голосов
/ 17 января 2020

Я реализую поток входа в систему auth0 для сервера node js, который обслуживает приложение реагирования. Я правильно реализовал потоки входа и выхода, но в URL-адресе /callback мне выдан фальшивый токен, который невозможно расшифровать.

Так что, если я посещаю /login, он приводит меня к Auth0 правильно сформировать; и я могу войти в систему, согласно журналам в Auth0. Но когда Auth0 перенаправляет обратно на URL обратного вызова, я получаю ложный токен.

app.get("/callback", (request, response, next) => {
  passport.authenticate("auth0", (auth0Error, token) => {
    if (!token){
      // HERE, token is false
    }
    ...
  })(request, response, next);
});

Что может вызвать этот ложный токен? Как работает функция аутентификации в обратном вызове? И как мне справиться с этим? Должен ли я попробовать auth0 снова?

1 Ответ

0 голосов
/ 20 января 2020

Чтобы понять проблему, я запустил проект в режиме отладки и добавил несколько точек останова. Если вы посмотрите внимательно, passport.authenticate() вызовет метод Auth0Strategy . Затем Auth0Strategy обменивается кодом для токена (поток кода авторизации) и возвращает профиль пользователя. Поэтому в маршруте обратного вызова токен недоступен. Я добавил следующие строки кода для доступа к accessToken в маршруте обратного вызова.

const strategy = new Auth0Strategy(
  {
    domain: process.env.AUTH0_DOMAIN,
    clientID: process.env.AUTH0_CLIENT_ID,
    clientSecret: process.env.AUTH0_CLIENT_SECRET,
    callbackURL: '/callback',

  },
  function(accessToken, refreshToken, extraParams, profile, done) {
    // accessToken is the token to call Auth0 API (not needed in the most cases)
    // extraParams.id_token has the JSON Web Token
    // profile has all the information from the user
    console.log(JSON.stringify(profile))
    console.log(accessToken);
    return done(null, profile, accessToken); // Passing access token 
  }
);

Тогда для маршрута обратного вызова должен быть доступен accessToken.

router.get('/callback', function (req, res, next) {
  passport.authenticate('auth0', function (err, user, token) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function (err) {
      if (err) { return next(err); }
      const returnTo = req.session.returnTo;
      delete req.session.returnTo;
      res.redirect(returnTo || '/user');
    });
  })(req, res, next);
});

Это было добавлено только для объяснения потока. Но вы можете игнорировать передачу токена для производственного приложения.

...