Auth0调用/oauth/token端点仅返回access_token缺失id_token问题
问题根因
无法返回id_token、refresh_token和Auth0免费订阅套餐无关,完全是配置和请求参数错误导致,具体问题如下:
- 缺失OIDC协议要求的scope参数:
id_token是OIDC协议的专属返回字段,必须在发起授权跳转(请求/authorize端点)时携带openidscope才会返回;要获取refresh_token需要额外添加offline_accessscope。注意scope是授权阶段由用户确认生效的,和生成的授权码code绑定,仅在调用/oauth/token换token阶段传scope没有任何作用。 audience参数值错误:audience字段需要填写Auth0后台「APIs」板块中你创建的业务API的唯一标识符(Identifier),你当前填的是登录回调地址https://localhost:3000/login.html,属于无效值,该场景下Auth0只会返回可访问/userinfo端点的不透明access_token,不会返回符合预期的身份凭证和API访问凭证。- 未开启离线访问权限:返回
refresh_token的前置条件除了添加offline_accessscope,还需要在对应Application(和你使用的client_id匹配的应用)的设置页开启「Allow Offline Access」开关。
修复步骤
- 修改引导用户跳转Auth0登录页的/authorize请求参数,新增scope字段,参考值:
// /authorize请求参数片段 scope: "openid profile offline_access"
其中openid为必填项(获取id_token必须),profile为可选项(添加后会在id_token中返回用户昵称、头像等基础信息),offline_access为获取refresh_token的必填项。
修正/oauth/token请求中的audience参数:
登录Auth0后台进入「APIs」板块,选中你要对接的业务API,复制其Identifier字段值,替换代码中audience的现有值,禁止使用回调地址作为audience值。开启离线访问权限:
进入Auth0后台「Applications」板块,选中当前使用的应用,在设置页找到「Allow Offline Access」选项并开启,保存配置。重新走完整授权流程:
清除浏览器中Auth0相关的cookie和已授权记录,重新跳转授权页完成登录获取新的授权码,使用新授权码调用/oauth/token端点即可正常返回id_token、access_token、refresh_token三个字段。
注意:授权码单次有效,且和发起授权时的参数强绑定,修改配置或授权请求参数后,必须重新走授权流程生成新code,使用旧code请求无法拿到正确结果。
内容的提问来源于stack exchange,提问作者JavascriptDeveloperMaintwo
相关产品推荐
相关产品推荐

