很可能我误解了这个主题,或者在实现过程中遗漏了一些东西。
我浏览了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));
和
// 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));
然后,我们将挑战传递给授权端点,如下所示(来自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
并将代码和眩晕器传递到令牌端点,如下所示(同样来自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'
实现是一件相当简单的事情,但我无法理解为什么另一个应用程序不能进行相同的挑战和验证,并模拟我们的应用程序?
我认为我们不使用client_secret作为授权代码流与暴露的client_secret使黑客更容易尝试令牌生成和假模拟我们的应用,为什么他们不能简单地模拟挑战和验证?
发布于 2021-02-04 01:49:39
PKCE的全部内容是验证发起初始身份验证请求的客户端是否与使用授权代码获取真实令牌的客户端相同。
PKCE是一种在身份提供者端实现的保护检查,与要求客户端执行检查的状态/当前安全特性相比较。
PKCE与客户端的秘密毫无关系。
发布于 2021-02-05 03:40:21
如果在应用程序或SPA中使用授权代码流而不使用PKCE,并且有人捕获您从授权服务器接收到的授权代码,则他将能够通过向授权服务器发送授权代码+客户端ID (密钥)和客户端机密,从授权令牌检索访问令牌。因为ID和机密对于应用程序的所有用户/客户端都是相同的。有了访问令牌,他就可以从资源服务器检索用户数据。
如果您在PKCE中使用授权代码流,则攻击者无法使用授权代码,因为他没有验证器。如果他创建自己的验证器和代码挑战,并构建自己版本的应用程序,他还需要让用户使用他的版本的应用程序。只有这样,在用户登录到授权服务器后,质询和验证器才会匹配。如果只捕捉到授权代码,那么生成自己的问题和验证程序是无用的,因为流程是从应用程序创建的挑战开始的,与他创建的验证程序不匹配。
发布于 2021-09-16 09:00:09
事实并非如此。带有PKCE的Auth代码只比隐式流更安全,而隐式流不涉及客户端秘密。
PKCE是一种实现更安全的授权代码流(否则需要客户端机密)的方法。
https://stackoverflow.com/questions/66043006
复制