Keycloak授权码格式存疑,调用Token端点返回Code not valid错误求助
问题描述
本地运行采用Standard Authorization Code Flow的Keycloak服务器,调用授权端点的URL为:
http://localhost:8080/realms/lapse/protocol/openid-connect/auth?client_id=lapse-app&redirect_uri=http://localhost:8080&response_type=code
认证成功后,被重定向至:
http://localhost:8282?session_state=6c93f810-d934-4e20-adcc-b21748d3b26a&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Flapse&code=6cc168fc-e894-4f8b-a401-ec3267dc69b1.6c93f810-d934-4e20-adcc-b21748d3b26a.eec3a0c8-ff4a-437b-ad17-5f6228422b0f
获取到三段式格式的授权码(与常见示例不同),Cookie已添加JWT,推测前期流程正常。但使用以下参数调用Token端点时,返回Code not valid错误:
{ grant_type : authorization_code, code : 6cc168fc-e894-4f8b-a401-ec3267dc69b1.6c93f810-d934-4e20-adcc-b21748d3b26a.eec3a0c8-ff4a-437b-ad17-5f6228422b0f, redirect_uri : http://localhost:8282, client_id : lapse-app, client_secret : ZLpHFtQzoYdf21rIDwblZlZZ0bFntaD7 }
疑问:是否需要对授权码重新格式化后再发送至Token端点?
问题分析与解决
1. 授权码无需格式化
Keycloak生成的三段式授权码是正常格式,不需要做任何修改,直接原样使用即可。
2. 核心错误原因:redirect_uri不匹配
OAuth2协议要求授权请求的redirect_uri必须与Token请求的redirect_uri完全一致。
- 你调用授权端点时用的是
http://localhost:8080 - 调用Token端点时用的是
http://localhost:8282
这两个URL端口不同,属于不匹配,直接导致授权码验证失败。
3. 次要可能原因:请求格式错误
Keycloak的Token端点默认只接受application/x-www-form-urlencoded格式的参数,你当前用的是JSON格式,这也会引发验证问题。
修正步骤
- 统一redirect_uri:将Token请求中的
redirect_uri改为http://localhost:8080,与授权请求保持一致 - 改用表单编码发送请求:用
application/x-www-form-urlencoded格式传递参数,示例curl命令:
curl -X POST http://localhost:8080/realms/lapse/protocol/openid-connect/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=authorization_code" \ -d "code=6cc168fc-e894-4f8b-a401-ec3267dc69b1.6c93f810-d934-4e20-adcc-b21748d3b26a.eec3a0c8-ff4a-437b-ad17-5f6228422b0f" \ -d "redirect_uri=http://localhost:8080" \ -d "client_id=lapse-app" \ -d "client_secret=ZLpHFtQzoYdf21rIDwblZlZZ0bFntaD7"
- 检查授权码有效期:Keycloak授权码默认有效期60秒,获取后请立即调用Token端点
- 验证客户端配置:在Keycloak后台确认:
- 客户端
lapse-app已开启Authorization Code Flow http://localhost:8080已添加到客户端的「Valid Redirect URIs」列表中
- 客户端
内容的提问来源于stack exchange,提问作者Benedikt J Schlegel
相关产品推荐
相关产品推荐

