部署在GKE上的Keycloak无法通过用户名密码完成用户认证
问题根因与解决方案
你遇到的报错是两个配置错误共同导致的,对应修复方案如下:
1. 调用了错误的端点
你当前请求的/auth/realms/demo/protocol/openid-connect/auth是授权码流程专用的授权端点,仅用于引导用户跳转登录获取授权码,不适用于grant_type=password的密码授权模式,密码模式需要请求令牌端点:
- 如果你部署的是旧版WildFly架构的Keycloak:令牌端点路径为
/auth/realms/demo/protocol/openid-connect/token - 如果你部署的是新版Quarkus架构的Keycloak(当前官方默认版本,GKE上部署的大概率是该版本):默认已经去掉了
/auth前缀,令牌端点路径为/realms/demo/protocol/openid-connect/token
你本地环境运行正常是因为本地用的是带/auth前缀的旧版本,GKE上的新版本路径规则发生了变化,所以原请求返回404。
2. 无需调整Redirect URI配置
Redirect URI仅在授权码流、隐式流这类需要浏览器跳转的流程中需要配置,密码授权模式不需要用到该配置。你修改Redirect URI为*之后出现的新报错,本质还是因为你请求了错误的授权端点,该端点要求传入response_type、redirect_uri等授权码流程必填参数,和Redirect URI配置本身无关。
3. 额外校验项
需要确认你Keycloak客户端的**直接访问授权(Direct Access Grants Enabled)**开关为开启状态,否则密码授权模式会被Keycloak主动拒绝。
正确请求示例(适用于新版Quarkus Keycloak)
curl --location --request POST 'http://<MY_KEYCLOAK_PUBLIC_IP>/realms/demo/protocol/openid-connect/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=demo-app' \ --data-urlencode 'username=test' \ --data-urlencode 'password=test' \ --data-urlencode 'grant_type=password' \ --data-urlencode 'client_secret=ee39b325-7dw4-4c0c-681f-29e2f7f63f57'
如果请求仍然返回404,可以加上/auth前缀再尝试。
内容的提问来源于stack exchange,提问作者Karim Tawfik
相关产品推荐
相关产品推荐

