iOS Developer的全栈之路 - Keycloak(7)
这一节中,我们来一起看看Keycloak的Identity Brokering。作为一个强大的用户管理服务,这个功能提供了快速集成第三方登录(Google,Facebook,Github等等)和已有Identity Provider的能力。

在添加了Identity Provider之后,在登录页面就可以看到如下选项:

工作流程
在后面的示例中,将演示如何集成Google和OAuth0,在演示之前,先来了解一下Identity Brokering的工作流程。下图取自官方文档:

- 用户访问某个需要登录后才能访问的服务,并且这个服务已经被Keycloak保护;
- 页面将跳转至登录页面;
- 登录页面显示除了使用用户名密码登录的其他方式,如上图
IDP Login Page
所示; - 用户可以选择其中一种登录方式;
- 此时Keycloak将向用户所选的Identity Provider发起一个请求进行认证,同时页面也会跳转至该Identity Provider;
- 用户在该Identity Provider(例如Google)所提供的认证页面中输入自己的用户名密码,完成认证;
- 认证成功后,将再次重定向回Keycloak的页面,同时在response中带有security token。这个token让Keycloak信任认证已经完成,并且Keycloak可以使用这个token从Identity Provider中获取该用户的信息;
- Keycloak校验从Identity Provider中获取的用户信息是否有效。当有效时,它会检查这个用户是否已经存在。如果存在,则完成认证;如果不存在,Keycloak将创建一个新用户,首先尝试从第7步中获取的token中解析得到创建新用户所需要的字段,当字段中的信息足够时,便可完成用户创建,若token中的信息不够充分时,将使用这个token向该Identity Provider发起请求获取用户信息。若此时获取的用户信息仍不够充分,则会弹出页面要求用户补全信息,最终完成用户创建。最后,Keycloak将返回给用户一个自己颁发的token。
- 当用户在Keycloak中完成了认证操作后,再把用户重定向回用户在第1步时想要访问的服务页面。
- 这个服务页面拿到token后,便给用户展示需要授权才可访问的信息。到此便完成了整个的第三方登录的过程。
示例
1. 添加Google Identity Provider
在左边菜单内选择Identity Providers,再在下拉菜单中选择Google,便会出现如下页面:

其中,最主要的就是前三个字段:Redirect URI,Client ID 以及 Client Secret。Redirect URI是需要提供给Google的,其他两个字段需要从Google Console中获取。接下来,通过 [Google Developer Console]
(https://console.cloud.google.com/project)创建一个Google Application。
-
创建应用
google console.png
点击创建应用,输入项目名称,便可完成创建
create project.png
创建成功后便会调转至项目首页
create successfully.png
-
配置应用
进入API和服务 -> OAuth同意屏幕:此处用于配置跳转至Google登录页面将显示的信息。首先Google提示需要选择User Type,此处选择外部,点击继续。
choose user type.png
在OAuth同意屏幕这里只需要输入应用名称即可,由于是测试,千万不要上传应用图片,否则App需要Google审核。
OAuth consent screen.png
-
创建Credential
选择凭据 -> 创建凭据 -> OAuth客户端ID
create credentials.png
之后选择Web应用
select web application.png
便可进入Credential的详情页,这里需要添加一个重定向URI,这个URI就是Keycloak为我们已经准备好的URI。右侧的客户端ID和客户端秘钥也正是Keycloak中所必须得两个字段。credential detail.png
填入这个两个字段后如下图所示:google identity provider detail.png
此时,在我们访问http://localhost:8080/auth/realms/demo/account/时,便可看到Google登录的选项了。
2. 添加OAuth0
除了可以集成这些Social平台,也可以集成实现了OpenID Connect协议的Identity Provider,这里我们使用OAuth0作为示例。在Identity Providers中选择OpenID Connect v1.0。进入详情页后,它的必填字段相比Google要多一些,包括了:Alias,Authorization URL,Token URL,Client Authentication 以及和Google相同的Client ID和Client Secret。其中Alias就是个它起个别名,随便填一个即可。
而这些信息都是OAuth0需要提供的,接下来需要在OAuth0注册一个应用

创建成功后,便可在Settings页面中看到Client ID和Client Secret

在Settings的Application Type中选择Regular Web Application,下方的Allowed Callback URLs也就是Keycloak中的Redirect URI。

到这里,还差两个必填字段Authorization URL,Token URL,展开OAuth0的Advanced Settings -> Endpoint便可看到这两个字段,对应OAuth0中的OAuth Authorization URL和OAuth Token URL

到此为止便完成了OAuth0的集成。由于使用OAuth0登录时,OAuth0无法提供Keycloak创建用户所需的信息,所以在登录后,可以看到如下页面,来补全用户信息:

小结
至此,已完成了Keycloak的Identity Provider功能的讲解,其中没有涉及的字段,大家可以自行参考文档进行理解,下一节将介绍Keycloak的另一个功能:User Federation。