关于 OAuth 2.0 授权流程的问题

Posted

技术标签:

【中文标题】关于 OAuth 2.0 授权流程的问题【英文标题】:Question about OAuth 2.0 authorization flow 【发布时间】:2020-05-17 08:29:38 【问题描述】:

我一直在查看来自Microsoft OAuth2 flow 的这张图片,我有一个问题

会弹出一个浏览器对话框,他们在其中输入凭据并同意权限;作为回报,我得到一个authorizationCode。有了这个authorizationCode,我应该向/oauth2/token 提出请求,并换取access_tokenrefresh_token

为了获得access_tokenrefresh_token,我必须将authorizationCodeclientSecret 结合起来。

我的问题是:谁应该请求access_token前端还是后端

我得到了authorizationCode 并将其发送到拥有clientSecret 的后端,并做了一些魔术并将access_token 返回给我,我可以进一步使用它来验证WebAPI? 或者一切都应该在前端完成并直接将access_token发送到API?

谢谢!

【问题讨论】:

Shury,你觉得我的回答有用还是有什么问题? 【参考方案1】:

我认为最好使用Proof Key for Code Exchange (PKCE) 而不是密码。 Microsoft supports it,请参阅 auth 请求参数 code_challengecode_challenge_method。然后是 token 端点的 code_verifier 参数,您可以使用它来代替密码。还有OAuth 2.0 for Native Apps RFC 说:

公共原生应用客户端必须实现代码证明密钥 Exchange (PKCE [RFC7636]) 对 OAuth 的扩展和授权 服务器必须支持此类客户端的 PKCE

示例:在发出身份验证请求之前,您生成一个随机文本(后来用作code_verifier),然后创建其 SHA-256 哈希(用作code_challenge)并让身份验证服务器知道您使用 SHA-256 和 &code_challenge_method=S256。身份验证服务器保留这些值,当您向 token 端点询问令牌时,它将根据 code_verifier 值创建自己的 SHA-256 哈希。如果哈希值等于您之前发送的code_challenge,则服务器将接受该请求。

【讨论】:

以上是关于关于 OAuth 2.0 授权流程的问题的主要内容,如果未能解决你的问题,请参考以下文章

OAuth 2.0 代码授权流程

Owin OAuth 2.0密码授权流程

OAuth 2.0:在授权代码流程中,谁最终将访问令牌交给我的 Web 浏览器?

前后端分离架构下的OAuth2.0授权流程

开放平台OAuth 2.0授权开发实践

安全预警关于OAuth 2.0存在第三方帐号快捷登录授权劫持漏洞