一张图,同事提供的,比较清晰的解释了Keycloak的整体结构
Keycloak最顶层是基于realm的,可以理解为领域,命名空间等。每个realm之间没有任何关系,属于相互独立的两个系统。Client对应具体的应用,比如每一个微服务就是一个Client。
对于Keycloak的所有操作都要经过认证,包括访问REST接口,没有携带有效token的话会报401未授权。获取Token主要有两种方式,一是账号+密码,二是clientid+secret,下面举两个例子。
用户名+密码
此种方式获取到的token是用户的token。
POST: ip:port/auth/realms/icp/protocol/openid-connect/token
加粗标记为需要修改的部分
Header
Body
一些解释:
此方式下,body中grant_type必须为password表明认证方式,其余三项可根据实际情况进行修改。返回信息如下
token_type表示当前token的类型,后续使用此token进行其它操作时(如创建用户)务必带上此值。
clientid+secret
此种方式获取到的token属于client,即应用的token,此种方式通常用于注册用户时,预先获取访问keycloak的权限,然后调用创建用户的api。
secret可在此获取
如果这里没有secret,检查对应client中settings选项卡Access Type的值是否为confidential,如下图。
URL及Header同第一种方式,只有Body部分不一样。
grant_type需要做对应修改。
如果返回401,检查settings页面Service Accounts Enabled开关是否打开。
2018-09-14 09:49:56 更新
URL规则是这样的:/auth/realms/{realms}/protocol/{协议类型}/token
protocol的类型可以在client的设置首页查看
下面说一下遇到的坑
在Keycloak官方文档上,关于接口的前缀是这么写的
然而如果按照文档上写的话一定是各种404和401错误,正确写法是这样的
/auth/realms/{realm}
创建用户等管理类操作是这样的
/auth/admin/realms/{realm}
感谢http://huangqiqing123.iteye.com/