node-oidc-provider单Access Token适配/userinfo与资源服务器问题及方案确认
关于node-oidc-provider无法签发兼顾/userinfo端点与API调用的Access Token的问题及方案确认
核心疑问
为什么node-oidc-provider拒绝签发可同时用于/userinfo端点和API(资源服务器)调用的单个Access Token?
- 在OAuth2和OIDC规范中,并未规定授权服务器不能签发此类令牌,相关技术讨论也表明该操作具备可行性。
- 但根据node-oidc-provider文档说明,/userinfo端点要求使用至少包含
openidscope且无资源服务器受众的不透明Access Token,这就导致同一令牌无法兼顾两种场景。
业务场景
我们的场景为自有移动应用、授权服务器及API,用户通过“连接到我们的服务器”登录,当前流程需分两步:
- 认证用户并获取userinfo
- 让用户授权调用API(请求仅用于该API的Access Token)
两次用户交互的流程体验不佳。
方案确认(基于@filip-skokan的回答)
方案1:通过idToken获取用户信息,无需调用/userinfo端点
- 操作流程:携带
resource参数发起授权请求,获取带资源服务器scope的令牌,用响应中的idToken获取用户信息,无需调用/userinfo端点。 - 正确性判断:此方案正确。OIDC规范中idToken本身就包含用户核心身份信息(只要请求的scope包含
openid及email等用户信息类scope),完全可以替代/userinfo端点的调用;同时携带resource参数的令牌可直接用于API调用,一次授权请求即可满足两个需求,避免两次用户交互。
方案2:利用refreshToken获取带资源scope的新Access Token
- 操作流程:启用refreshToken签发,先发起仅包含用户信息scope(如
openid、email)的授权请求,获取Access Token和refreshToken后,用refreshToken获取带资源scope的新Access Token。 - 疑问解答:是否需要二次授权取决于授权服务器的consent配置:
- 如果初始授权时用户已同意“可后续扩展相关权限”,或授权服务器允许通过refreshToken静默获取新增scope权限,则不会强制用户再次授权。
- 如果授权服务器默认要求对新增scope重新获取用户同意,则会触发二次授权。
建议优化方向:初始授权时就包含所有可能用到的scope(包括资源服务器的scope),或调整授权服务器配置,允许通过refreshToken静默扩展资源scope权限。
内容的提问来源于stack exchange,提问作者Dahkenangnon
相关产品推荐
相关产品推荐

