我正在为一个提供反应应用程序的节点js服务器实现一个auth0登录流程。我已经正确实现了登录和注销流程,但在/callback
URL 中,我得到了一个无法解密的虚假令牌。
因此,如果我访问/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 吗?
为了理解这个问题,我在调试模式下启动了该项目并添加了一些断点。如果你仔细观察,passport.authenticate()
方法调用Auth0Strategy。然后,Auth0Strategy 将代码交换为令牌(授权代码流(并返回用户配置文件。因此,在回调路由中,令牌不可用。我添加了以下代码行来访问回调路由中的访问令牌。
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
}
);
然后,回调路由应该有可用的访问令牌。
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);
});
添加它只是为了解释流程。但是,您可以忽略传递生产应用程序的令牌。