Keycloak集成GitHub身份提供商时Postman获取令牌报invalid_grant错误
问题场景
我用Postman通过OAuth 2.0授权码模式,以Keycloak作为身份认证提供商获取API访问令牌。使用Keycloak本地用户凭证登录完全正常,但切换到GitHub身份提供商登录时,在最后调用令牌接口阶段报错:
请求:
POST https://{host:port}/realms/{myrealm}/protocol/openid-connect/token
响应体:{"error":"invalid_grant","error_description":"Code not valid"}
复现环境与步骤
- Keycloak版本:21.1.1
- 在目标Realm中创建GitHub身份提供商,填入GitHub OAuth应用的ClientId和ClientSecret,启用令牌存储;设置「首次登录流程」为
first broker login,「登录后流程」为None - 在GitHub OAuth应用中,配置Keycloak GitHub身份提供商的重定向URI(首页URL+授权回调URL)
- Postman OAuth 2.0配置:
- Token名称:testing
- 授权类型:Authorization Code
- 认证URL:
https://{host:port}/realms/{myrealm}/protocol/openid-connect/auth - 访问令牌URL:
https://{host:port}/realms/{myrealm}/protocol/openid-connect/token - ClientId:Keycloak客户端应用的ClientId
- ClientSecret:Keycloak客户端应用的ClientSecret
- 客户端认证:作为Basic Auth标头发送
注:已重新生成客户端应用的ClientSecret,排除授权码重复使用的问题,但故障依旧。
解决方向
1. 严格匹配GitHub OAuth应用的重定向URI
Keycloak的GitHub身份提供商回调URL必须和GitHub后台配置的完全一致,包括协议(http/https)、域名、端口、路径。比如Keycloak里的回调URL是https://your-keycloak-domain/realms/{myrealm}/broker/github/endpoint,必须原封不动填到GitHub OAuth应用的「Authorization callback URL」里,不能有多余斜杠或拼写错误。
2. 调整Keycloak身份提供商的「登录后流程」
把「登录后流程」从None改成browser(或Realm默认的登录流程)。第三方身份提供商登录后,Keycloak需要完成自身会话处理,若设置为None会导致授权码生成逻辑异常,无法与后续令牌请求匹配。
3. 确认Postman的授权码传递正确性
触发授权流程后,跳转GitHub授权成功时,检查Postman回调URL中的code参数是否正常,再确认Postman发送令牌请求时的code参数与回调中的完全一致。若存在网络代理、Cookie拦截,可能导致授权码篡改或丢失。
4. 配置Keycloak客户端的有效重定向URI
确保Keycloak客户端应用的「Valid Redirect URIs」包含Postman的默认回调URL:https://oauth.pstmn.io/v1/callback,否则Keycloak生成的授权码会被标记为无效。
5. 关闭GitHub身份提供商的「Force POST Binding」
在GitHub身份提供商的高级设置中,若开启了「Force POST Binding」,可能导致授权码传递方式不符合Postman预期,尝试关闭该选项后重新测试。
内容的提问来源于stack exchange,提问作者amin

