授权码流中使用客户端密钥为SPA刷新访问令牌是否安全?
SPA 授权码流刷新令牌的客户端密钥问题
你判断的「绝对不应该向SPA暴露客户端密钥」是完全正确的,完全符合OAuth2的公开客户端安全规范。
你查到的需要携带client_secret的刷新令牌请求示例,都是针对机密客户端的场景(比如后端托管的Web服务、服务端定时任务等),这类客户端运行在可信的服务侧,可以安全存储客户端密钥,因此流程上要求携带该参数做身份校验。
而SPA属于公开客户端,运行在用户侧的浏览器环境中,本身就不可能安全存储敏感的密钥信息,因此OAuth2针对这类场景的授权码流(现在强制要求搭配PKCE校验)做了专门适配:
- 首次授权码交换令牌时不需要携带
client_secret - 后续使用刷新令牌换取新的访问令牌时,也不需要携带
client_secret,仅需要传入以下参数即可:
POST /.../v2.0/token Content-Type: application/x-www-form-urlencoded client_id=你的应用ID &scope=申请的权限范围 &refresh_token=已获取的刷新令牌 &grant_type=refresh_token
你之前看到的示例属于机密客户端的请求样例,不适用SPA场景,不需要照搬client_secret参数:
POST /.../v2.0/token Content-Type: application/x-www-form-urlencoded ?client_id=... &scope=wide_and_proud &refresh_token=OAAABAAAAiL9Kn2Z27UubvWFP... &grant_type=refresh_token &client_secret=hakuna_matata
现在主流的身份提供商的前端SDK已经默认封装了这套公开客户端的刷新逻辑,不会要求你在前端配置和暴露客户端密钥,可以直接使用。
内容的提问来源于stack exchange,提问作者Konrad Viltersten
相关产品推荐
相关产品推荐

