当某些合作商希望把你的keycloak作为他们的一种第三方登录方式时,就像微信,google,github,使用你的keycloak上的账户资源时,你就需要考虑如何做一个开放的,标准的文档了。
一 基本角色
- 认证提供者:keycloak服务,https://kc.xxx.com
- 第三方应用:先到keycloak上注册,由keycloak颁发client_id和client_secret,并与第三方应用确定好callback回调地址。
- 用户:使用keycloak服务完成登录,然后去访问第三方应用,当然也可以访问对接到keycloak上的所有服务资源。
二 接入流程
1 向keycloak管理员提供第三方应用基本信息,应用名称,回调地址,管理员添加好之后,连同client_id和client_secret告诉第三方应用。
2 在第三方应用中,添加法宝登录链接,例如:
<a href="https://kc.xxx.com/auth/realms/fabao/protocol/openid-connect/auth?client_id=aaa&redirect_uri=http://localhost:8080/callback%3Fredirect_uri%3Dhttp%3A%2F%2Flocalhost%3A8080%2Fhello&response_type=code&scope=openid">kc登录</a>
- 客户端ID client_id=aaa
- 授权类型 response_type=code
- scope类型 scope=openid
- 三方应用的回调地址 redirect_uri
注意:您在对接时,需要对redirect_uri参数进行urlencode编码。
3 登录成功后,keycloak会根据你的回调地址,重定向到你的系统中,并带着code和redirect_uri及session等信息。
http://localhost:8080/callback?redirect_uri=http://localhost:8080/hello&session_state=45691669-f290-4991-8f43-d6c411a91b7c&code=b3921500-f6a6-494d-ad23-41b75c436fe7.45691669-f290-4991-8f43-d6c411a91b7c.02bb9b29-2c53-45c7-b009-43e3c78c6aff
- 三方应用系统的回调地址:redirect_uri
- 授权码:code
- 会话标识:session_state
三 获取用户信息
在三方应用自己的callback接口里,可以进行用户的映射与持久化,你可以通过传过来的code来获取当前用户在keycloak平台的access_token,然后你再根据access_token获取用户基本的开放的信息,你可以将这个用户信息保存到应用的本地数据库,当然也可以与你现有用户进行绑定。
1 通过code来获取access_token:/auth/realms/xxx/protocol/openid-connect/token
响应内容为access_token和refresh_token
2 通过access_token来获取用户信息,正常返回200,如果是返回401,你需要从新获取
获取用户信息:/auth/realms/xxx/open/userinfo
{
"nickname": "张三",
"userId": "347c9e9e-076c-45e3-be74-c482fffcc6e5",
"username": "test"
}
3 当三方应用通过keycloak的接口获取到了用户信息之后,您就可以与本地账号进行映射了,一般的做法是这样的,如图: