未找到授权令牌 - Express-JWT 和 Auth0
Posted
技术标签:
【中文标题】未找到授权令牌 - Express-JWT 和 Auth0【英文标题】:No authorization token was found - Express-JWT and Auth0 【发布时间】:2019-12-11 14:04:00 【问题描述】:我正在努力将 Auth0 集成到 MERN Stack 应用程序中。流程应如下所示:
-
用户点击登录按钮触发 Auth0Lock.show()
用户填写其凭据并单击提交按钮
API 的回调 URL 被命中,用户登录并将他们重定向回前端应用程序
(到目前为止,一切看起来都运行良好)
-
前端向 API 请求用户信息
前端接收信息并重定向
这似乎是一个相当标准的身份验证流程。问题是前端向后端询问用户信息时,报错:
UnauthorizedError: No authorization token was found
我的设置基本上是这样的:
// client-side config
const lock = new Auth0Lock(clientID, domain,
auth:
responseType: 'token',
audience: 'https://$domain/userinfo',
redirectUrl: API_URL + '/api/users/callback',
params:
scope: 'openid profile email' // no change
)
// server.js
app.use(bodyParser.urlencoded( extended: false ));
app.use(bodyParser.json());
// [DB setup]
var sessConfig =
secret: "[random string]",
cookie:
sameSite: false
,
resave: false,
saveUninitialized: true
;
if(app.get('env') === 'production') sessConfig.cookie.secure = true;
app.use(session(sessConfig));
const domain, clientID, clientSecret, callbackURL = require('./config/auth0');
const passportStrategy = new Auth0Strategy(
domain, clientID, clientSecret, callbackURL,
(accessToken, refreshToken, extraParams, profile, done) => done(null, profile)
)
passport.use(passportStrategy);
passport.serializeUser((user, done) => done(null, user));
passport.deserializeUser((user, done) => done(null, user));
app.use(passport.initialize());
app.use(passport.session());
// [routing]
// routes/users.js
router.get('/callback', (req, res, next) =>
passport.authenticate('auth0', (err, user, info) =>
if(err) return next(err);
if(!user) return next(info);
req.logIn(user, err =>
if(err) return next(err);
const returnTo = req.session.returnTo;
delete req.session.returnTo;
res.redirect(returnTo || clientRootURL + '/callback');
)
)(req, res, next);
)
router.get(
'/current',
require('cors')(),
authenticate,
(req, res) =>
res.json(
id: req.user.id,
name: req.user.name,
email: req.user.email
);
);
// authenticate.js
module.exports = jwt(
secret: jwksRsa.expressJwtSecret(
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: `https://$domain/.well-known/jwks.json`
),
audience: clientID,
issuer: `https://$domain/`,
algorithms: ['RS256']
);
绝大多数直接来自 Auth0 文档。 登录后我试图从 /users/current 端点获取用户信息,它说它找不到授权。有谁知道如何让它工作?
【问题讨论】:
【参考方案1】:您应该调用 /userinfo 端点来获取用户配置文件,或者从 id_token 获取信息。看看这个文档
https://auth0.com/docs/api/authentication#get-user-info
【讨论】:
【参考方案2】:每个经过身份验证的前端调用都应包含:
headers:
Authorization: `Bearer $token`,
,
token
应该在哪里:
const token = await getAccessTokenSilently();
getAccessTokenSilently
是 auth0
库的公共函数。
见:getAccessTokenSilently doc
【讨论】:
以上是关于未找到授权令牌 - Express-JWT 和 Auth0的主要内容,如果未能解决你的问题,请参考以下文章
express-jwt 和带有 cookie 的 Angular 9:未在“授权”标头中设置令牌
使用带有 RS256 加密的 express-jwt 在应用程序路由上解码 JWT 令牌会引发未经授权的错误