我正在构建 2 个应用程序;一个前端,一个后端。
后端将使用 Rails API + Doorkeeper Gem(oauth2 提供者)构建,而前端将使用 React Native 构建。
目前,我正在使用“客户端凭据授予流程”,目前运行良好。但是经过一段时间的研究,这个流程不应该在仅限客户端的应用程序中使用,因为它暴露了client_secret
如果有人反编译了应用程序。
我还阅读了仅需要client_id
. 但这个流程现在似乎已经过时了?
并据此:https ://auth0.com/docs/api-auth/which-oauth-flow-to-use#is-the-client-a-single-page-app-
建议使用“带有 PKCE 的授权码授予”而不是“隐式授予流程”。我能够使它工作,但问题是它仍然需要client_secret
才能获得access_token
,这是应该的吗?
这是我正在做的示例流程:
curl -X POST 'http://localhost:3000/oauth/authorize?client_id=xxxx&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=public&code_challenge=testchallenge&code_challenge_method=plain'
这会给我以下回应:
{
"status": "redirect",
"redirect_uri": {
"action": "show",
"code": "8quZ-EAiKKG2EKnQiSYs3xeFRCgsIwcTbaWNdjnpyFg"
}
}
然后我将使用上面的代码通过下面的请求获取访问令牌:
curl -i http://localhost:3000/oauth/token \
-F grant_type="authorization_code" \
-F client_id="xxxx" \
-F client_secret="xxxx" \
-F code="8quZ-EAiKKG2EKnQiSYs3xeFRCgsIwcTbaWNdjnpyFg" \
-F redirect_uri="urn:ietf:wg:oauth:2.0:oob" \
-F code_verifier="testchallenge"
现在问题来了,为了交换code
我access_token
仍然需要client_secret
. 如果两者都只会公开我的,它与“客户凭证授予流程”有何不同client_secret
?
上面的命令将返回以下内容:
{
"access_token": "nQoorBqLxQH4qFpmlx3mGG6Cd_TfX4d3L3gAGOTwrFs",
"token_type": "Bearer",
"expires_in": 7200,
"scope": "public",
"created_at": 1595517643
}
如果我不包括client_secret
在请求中是响应:
{
"error": "invalid_client",
"error_description": "Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method."
}
所以这是我的问题:
- 我们真的需要
client_secret
进入access_token
PKCE 流程吗? - 为什么建议使用“PKCE Flow”,如果它只会暴露
client_secret
? - 它与同样公开的“客户凭证授予流程”有何不同
client_secret
?
Doorkeeper PKCE 文档:https ://github.com/doorkeeper-gem/doorkeeper/wiki/Using-PKCE-flow