Express集成Auth0角色权限遇No authorization token was found错误求助
问题解决方法
首先解决"No authorization token was found"报错
你的报错直接由以下两个原因导致:
- 代码中全局挂载了
checkJwt中间件:你写了server.use(checkJwt);,这会让所有未经单独路由配置的请求都必须携带JWT令牌,包括你不需要管控的SPA页面路由、静态资源路由,直接触发无令牌报错。直接删除这行全局挂载代码即可,checkJwt只需要在你需要管控的API路由上单独声明即可,比如你已经写的/api/private、/api/private-scoped路由已经单独加了checkJwt,不需要全局挂载。 - 两套身份校验逻辑混用未适配:你同时用了
express-openid-connect(用于页面登录,基于Cookie会话识别身份)和express-jwt(用于API校验,基于请求头的Bearer令牌识别身份)。作为SPA应用,前端调用受管控的API接口时,必须先从Auth0获取到access_token,每次请求时在请求头中携带Authorization: Bearer <你获取到的access_token>,否则express-jwt无法读取到令牌就会抛出对应错误。
完成Auth0角色权限配置步骤
- 登录Auth0后台,进入你创建的API项目,先定义你需要用到的权限,比如你代码中用到的
admin:read,需要先在API的Permissions选项卡下完成创建。 - 进入Roles选项卡创建对应的角色,比如管理员、普通用户等,给每个角色分配对应的权限。
- 给你需要分配权限的用户绑定对应角色,或者在Auth0的登录Action流中添加自定义逻辑,把用户的角色、权限信息写入access_token的自定义声明中。
- 前端发起Auth0授权请求时,必须指定正确的audience(即你代码中写的
https://villatranquila.herokuapp.com/)和需要的scope参数,这样Auth0返回的access_token中才会包含你需要的权限字段,jwtAuthz中间件才能正常校验权限。
其他注意事项
你当前/api/private-scoped路由的注释说明要求的scope是read:messages,但jwtAuthz中间件中写的校验规则是['admin:read'],二者不匹配的话后续会触发权限不足报错,需要根据你的实际需求统一二者的值。
内容的提问来源于stack exchange,提问作者Martin Gonzalez
相关产品推荐
相关产品推荐

