oauth-2.0 - 使用 PKCE 的授权代码流如何比没有 client_secret 的授权代码流更安全
问题描述
很可能我对这个主题有误解,或者在实施过程中遗漏了一些东西
我浏览了 Auth0 的文档,通过端点而不是 SDK 创建使用 PKCE 的授权代码流,我看到我们提出了如下挑战和验证器(来自 auth0 doc):
// 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 doc):
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 doc):
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 使黑客更容易尝试生成令牌和虚假模拟我们的应用程序,为什么他们不能简单地模拟挑战和验证者?
解决方案
PKCE 就是要验证发起初始身份验证请求的客户端是否也是使用授权码获取真实令牌的客户端。
与要求客户端进行检查的状态/随机数安全功能相比,PKCE 是在身份提供者端实施的保护检查。
PKCE 与客户端机密完全无关。
推荐阅读
- python - 交叉递归图计算迭代的问题
- c - 使用UDP向服务器发送结构,为什么服务器得到错误的数字?
- python - ElasticSearch 字段提升
- python - 如何使用 gluon-cv model_zoo 并通过 Python 输出到 OpenCV 窗口?
- r - 插入符号 R 包中的混淆矩阵
- javascript - 下拉过滤器和复杂的条件语句
- python - Scrapy:抓取嵌入在href中的文本
- android - 如何在 Arcgis android Sdk 中使用来自 GIBS 的基本地图
- javascript - 在整页网站上嵌入谷歌地图
- sql-server - 一个脚本中的并行更新