Чтобы понять проблему, я запустил проект в режиме отладки и добавил несколько точек останова. Если вы посмотрите внимательно, 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);
});
Это было добавлено только для объяснения потока. Но вы можете игнорировать передачу токена для производственного приложения.