我正在浏览Okta's PCKE Flow demo以更好地理解它的工作原理,但我在复制从code_verifier
生成的相同code_challenge
哈希时遇到了麻烦。以下是演示的屏幕截图:
使用Zg6klgrnixQJ629GsawRMV8MjWvwRAr-vyvP1MHnB6X8WKZN
作为代码验证器,他们是如何生成iF_7prUeJ6rr3jMG3LmhW3R1cZ2ecZavFqS0jtb6tzo
作为代码挑战?
使用这个SHA256 hash calculator和Base64 Encoder,我得到了ODg1ZmZiYTZiNTFlMjdhYWViZGUzMzA2ZGNiOWExNWI3NDc1NzE5ZDllNzE5NmFmMTZhNGI0OGVkNmZhYjczYQ
,它与iF_7prUeJ6rr3jMG3LmhW3R1cZ2ecZavFqS0jtb6tzo
的期望值不匹配。我做错了什么,没有得到期望值?
这个SHA256 base 64 hash calculator from approsto给出了一个非常接近预期值的值。使用这个计算器,我得到了iF/7prUeJ6rr3jMG3LmhW3R1cZ2ecZavFqS0jtb6tzo
,它与预期值相差一个字符(注意这里是/
而不是_
)。
我做了什么导致了这个差异?如何计算iF_7prUeJ6rr3jMG3LmhW3R1cZ2ecZavFqS0jtb6tzo
的预期code_verifier
值?谢谢
4条答案
按热度按时间dsekswqp1#
PKCE代码质询是验证器的Base64-URL编码的SHA 256散列。这意味着您需要获取原始字符串,计算它的SHA 256哈希,然后对哈希进行Base64-URL编码。这是一个很大的单词,所以让我们通过它。
你上面尝试做的事情有两个问题:
您找到的在线SHA 256哈希计算器将哈希输出为十六进制编码的字符串,而不是原始字节。这通常是有帮助的,但在这种情况下不是。因此,通过base64编码所做的下一件事是,您正在对哈希的十六进制表示进行base64编码,而不是原始字节。您需要使用一个哈希函数来输出原始字节,并将原始字节传递给base64-url-encoder。
下一个问题是你需要base64-url编码,而不是base64编码。Base64-URL编码是Base64编码的一个微小变化,其中唯一的区别是使用字符
-
而不是+
和_
而不是/
,并从末尾修剪=
填充字符。这使得它是URL安全的,因为否则需要在URL中转义+/=
字符。因此,要计算PKCE代码挑战,您需要使用SHA 256函数,该函数可以给予原始字节,然后使用修改后的Base64编码函数对这些字节进行编码。
下面是一些PHP代码,可以做到这一点:
在浏览器中也可以使用纯JavaScript,但由于WebCrypto API的复杂性,代码稍长:
ubbxdtey2#
基于Aaron的例子和破解pkce-challenge节点包,我使用的是:
hpcdzsge3#
其中,qwe是code_verifier
x8goxv8g4#
我也遇到了同样的问题,想在Postman中创建
code_challenge
作为预请求脚本,并提出了以下内容。如果你想达到同样的目标,可能会对你有帮助。我的code_verifier
设置在一个环境中,挑战值也将保存到环境中: