Spotify PKCE授权流程返回“code_verifier was incorrect”问题求助
我刚仔细看了你的问题和代码,发现几个关键的排查点,应该能帮你解决这个code_verifier was incorrect的错误:
你用错了code_challenge的格式:
PKCE规范要求code_challenge必须是base64url编码的SHA256哈希值,而不是哈希结果的十六进制字符串。你代码里在授权请求中传入的是challenge(那个长十六进制字符串),但你已经预计算出了正确的challengeBase64URL,应该把这个值传给code_challenge参数,而不是十六进制的哈希结果。这是最可能导致验证失败的原因!检查code_verifier的长度是否符合要求:
Spotify的PKCE规则明确要求code_verifier的长度必须在43到128字符之间。你的verifier是41个a,不符合长度要求,这会直接导致服务器验证不通过。你需要把verifier加长到至少43个字符(比如再加两个a,或者使用符合长度的随机字符串)。确认base64url编码的正确性:
确保你的base64url编码严格遵循PKCE规范:- 对code_verifier执行SHA256哈希得到二进制Data
- 将该Data转换为标准base64字符串
- 替换
+为-、/为_,并移除末尾所有的=符号
你可以再核对一下你的challengeBase64URL是否符合这个规则,比如有没有残留的=,或者符号替换是否完全。
确保redirect_uri完全一致:
授权请求(第二步)和token请求(第四步)中的redirect_uri必须完全匹配,包括大小写、编码格式、特殊字符的处理。你可以分别打印两次请求中的redirect_uri字符串,确认它们没有任何差异。检查授权code是否过期:
Spotify的授权code有效期仅为10分钟,如果你在获取code后间隔太久才发起token请求,code会失效,服务器也会返回invalid_grant错误。建议在获取code后立即发起token请求。确认code_verifier未被修改:
检查你的代码逻辑,确保授权请求使用的verifier和token请求使用的verifier是同一个值,没有在中间被修改或重新生成。比如你代码中使用verifier!,要确保这个可选值确实指向你最初设定的长字符串,没有被nil或其他值覆盖。
建议你优先修正前两个问题(替换code_challenge为base64url格式、调整verifier长度),再重新测试,应该就能解决这个问题了。
内容的提问来源于stack exchange,提问作者dishanest

