使用 PKCE 的授权代码流如何比没有 client_secret 的授权代码流更安全

Meh*_*ein 6 openid authorization oauth-2.0 auth0 pkce

很可能我误解了有关该主题的某些内容或在实施过程中遗漏了某些内容

我浏览了 Auth0 的文档,通过端点而不是 SDK 使用 PKCE 创建授权代码流,我看到我们提出了如下挑战和验证程序(来自 auth0 文档):

// Dependency: Node.js crypto module
// https://nodejs.org/api/crypto.html#crypto_crypto
function base64URLEncode(str) {
    return str.toString('base64')
        .replace(/\+/g, '-')
        .replace(/\//g, '_')
        .replace(/=/g, '');
}
var verifier = base64URLEncode(crypto.randomBytes(32));
Run Code Online (Sandbox Code Playgroud)

和

// Dependency: Node.js crypto module
// https://nodejs.org/api/crypto.html#crypto_crypto
function sha256(buffer) {
    return crypto.createHash('sha256').update(buffer).digest();
}
var challenge = base64URLEncode(sha256(verifier));
Run Code Online (Sandbox Code Playgroud)

然后我们将质询传递给授权端点,如下所示(来自 auth0 文档):

https://YOUR_DOMAIN/authorize?
    response_type=code&
    code_challenge=CODE_CHALLENGE&
    code_challenge_method=S256&
    client_id=YOUR_CLIENT_ID&
    redirect_uri=YOUR_CALLBACK_URL&
    scope=SCOPE&
    audience=API_AUDIENCE&
    state=STATE
Run Code Online (Sandbox Code Playgroud)

并将代码和验证器传递到令牌端点,如下所示(再次来自 auth0 文档):

curl --request POST \
  --url 'https://YOUR_DOMAIN/oauth/token' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=authorization_code \
  --data 'client_id=YOUR_CLIENT_ID' \
  --data code_verifier=YOUR_GENERATED_CODE_VERIFIER \
  --data code=YOUR_AUTHORIZATION_CODE \
  --data 'redirect_uri=https://YOUR_APP/callback'
Run Code Online (Sandbox Code Playgroud)

实现是一件相当简单的事情,但我不明白另一个应用程序如何不能做出相同的挑战和验证并模拟我们的应用程序?

我认为我们不使用 client_secret 作为授权代码流,暴露的 client_secret 使黑客更容易尝试令牌生成和错误模拟我们的应用程序,为什么他们不能简单地模拟挑战和验证者?

And*_*ndy 4

PKCE 的目的是验证发起初始身份验证请求的客户端是否也是使用授权码获取真实令牌的客户端。

与需要客户端进行检查的 State/Nonce 安全功能相比,PKCE 是在身份提供商端实现的保护检查。

PKCE 与客户端秘密完全无关。

  • 如果它用于生产用途,我不会自己实现它,对于生产我将使用 https://github.com/IdentityModel/oidc-client-js 或类似的现成库。自己实现 PKCE 并不难。您只需要存储验证器,也许在 cookie 或本地存储中。 (2认同)