我一直在看Microsoft OAuth2 flow中的图像,但有一个问题
会弹出一个浏览器对话框,在该对话框中输入凭据并同意权限;作为回报,我得到一个authorizationCode
。有了这个authorizationCode
,我应该向/oauth2/token
发出请求,并交换access_token
和refresh_token
。
为了获得access_token
和refresh_token
,我必须将authorizationCode
与clientSecret
组合。
我的问题是:谁应该请求access_token
? frontend或backend?
我得到authorizationCode
并将其发送到保存clientSecret
的后端,并进行了一些魔术操作,然后将access_token
返回给我,我可以将其进一步用于针对WebAPI进行验证?还是应该在前端完成所有操作,然后直接将access_token
发送到API?
谢谢!
我认为最好的方法是使用Proof Key for Code Exchange(PKCE)代替密码。 Microsoft supports it,请参阅auth
请求参数code_challenge
和code_challenge_method
。然后是code_verifier
端点的token
参数,您可以使用该参数代替密码。还有OAuth 2.0 for Native Apps RFC,它表示:
公开的本机应用客户端必须实现代码的证明密钥交换(PKCE [RFC7636])对OAuth和授权的扩展服务器必须为此类客户端支持PKCE
[示例:在发出身份验证请求之前,您生成一个随机文本(后来用作code_verifier
),然后创建其SHA-256哈希(用作code_challenge
),并让身份验证服务器知道您使用了具有&code_challenge_method=S256
的SHA-256。身份验证服务器保留这些值,并且当您向token
端点询问令牌时,它将从code_verifier
值中创建自己的SHA-256哈希。如果哈希等于您之前发送的code_challenge
,则服务器将接受该请求。