Spring Boot集成Keycloak谷歌登录后如何通过谷歌令牌获取Keycloak凭证?
核心实现逻辑
你需要用到Keycloak符合RFC 8693标准的**令牌交换(Token Exchange)**能力,直接用谷歌返回的ID令牌交换Keycloak的正式身份令牌即可。
前置配置要求
首先需要确保你已经完成Keycloak侧的基础配置:
- 目标Keycloak领域中已将谷歌添加为身份提供商,配置的谷歌客户端ID与你获取谷歌令牌时使用的客户端ID完全一致
- 已开启对应领域的令牌交换功能,且给你的Spring Boot应用关联的Keycloak客户端开放了谷歌身份提供商的令牌交换权限
- 可根据业务需求提前配置好谷歌身份提供商的用户属性映射规则,交换令牌时Keycloak会自动同步用户邮箱、姓名等信息到本地用户库
调用端点说明
需要调用Keycloak的统一令牌端点,请求方式为POST:
{keycloak服务地址}/realms/{你的领域名称}/protocol/openid-connect/token
请求头指定Content-Type: application/x-www-form-urlencoded,请求参数如下:
| 参数名 | 参数值说明 |
|---|---|
| grant_type | 固定值:urn:ietf:params:oauth:grant-type:token-exchange |
| subject_token | 填谷歌返回的id_token字段值 |
| subject_issuer | 填你在Keycloak中配置谷歌身份提供商时设置的别名,比如你设置的别名是google就填这个值 |
| client_id | 填你的Spring Boot应用在Keycloak中关联的客户端ID |
| client_secret | 如果你的Keycloak客户端为保密类型,需要补充该参数填对应客户端的密钥 |
以下是示例请求:
curl --location --request POST 'http://127.0.0.1:8080/realms/demo/protocol/openid-connect/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \ --data-urlencode 'subject_token=eyJhbGciOiJSUzI1NiIsImtpZCI6Ijc0MjE3YjhkYWRiYjM2NTc4MzU4MGY5ZTkyNDg3ZDTYiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXpwIjoiODY5Njc1Nzc0MjgxLTY4ZmExbjY3ZW41NW5zb3YyaGdib2JtZG05c3VlMDB1LmFwcHMuZ29vZ2xldXNlcmNvbnRlbtIiwiYXVkIjoiODY5Njc1Nzc0MjgxLTY4ZmExbjY3ZW41NW5zb3YyaGdib2JtZG05c3VlMDB1LmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTAxNDE4ODQ2MDM0MzI5Nzk0ODcwIiwiZW1haWwiOiJtYXJpbnNwYWppYzE5OThAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF0X2hhc2giOiJlbno5VDhuc3NLSHNqaEdVbFZQV253IiwiaWF0IjoxNjMxNTUzNjAyLCJleHAiOjE2MzE1NTcyMDJ9.oU_LAWPQU0RJ5yMM7M-xtKdM1rpLy2xqIg46kHu0KWR_1_2IY_tc3Uf1v2nNoEAQVXnZVbScUaHspwNny8yDirybxgOX_73aPGzb_FmcjVqgLTZTt8dbjizgy412cNFskH3GuRAXRMZppDbPPKlE2sgceMxapboCuivXIRyAyDQ_uXHSINEaPKFE3Tqjx-x6T6epcqY8M4hCt8Obs929BT86e3Ky6Xj1DUBv5UMm1Hk8NxoD_JU-rFLPQx-FZrVV3kYkdbJWKpoUVU-CToXDR4yRmxYXoz2kZMlc-rgugxxJ3OKG-JotVfSDh5Vp5iHy9kUpHOxi_8vWKw28LwNNhA' \ --data-urlencode 'subject_issuer=google' \ --data-urlencode 'client_id=springboot-demo-app' \ --data-urlencode 'client_secret=abc123def456'
请求成功后会直接返回Keycloak生成的access_token、refresh_token、id_token以及过期时间等信息,解析令牌即可拿到用户的完整身份数据。
Spring Boot集成建议
- 如果项目已经引入
keycloak-spring-boot-starter依赖,直接封装上述POST请求逻辑即可,无需额外引入其他组件 - 发起交换请求前可先对谷歌返回的ID令牌做基础校验,包括签名有效性、过期时间、签发方、受众是否匹配,避免发起无效请求
- 拿到Keycloak的访问令牌后,即可沿用常规的Keycloak鉴权逻辑做接口权限控制,也可通过Keycloak的用户信息接口获取更多用户属性
内容的提问来源于stack exchange,提问作者Djordje
相关产品推荐
相关产品推荐

