如何调用Keycloak API实现自定义SSO单点登录流程?
Keycloak 纯API对接登录实现方案
Keycloak默认SSR登录页携带的session_code、execution、tab_id等参数,是浏览器跳转交互流程里绑定临时会话的参数,纯API对接不需要走这套SSR页面逻辑,直接按标准OIDC协议调用对应接口即可,三个接口的使用方式如下:
/auth/realms/{realm}/login-action/authenticate:这个是SSR登录页的内部表单提交接口,仅适配浏览器页面交互流程,纯API场景完全不需要调用。要调这个接口就得先模拟浏览器完整访问登录页拿全临时参数,属于冗余操作,没有必要。/auth/realms/{realm}/protocol/openid-connect/certs:这个是OIDC标准的公钥查询接口,作用是返回Keycloak给各类Token签名用的公钥,用来校验你拿到的Token是否合法、有没有被篡改。调用方式很简单,直接发GET请求即可,不需要携带任何参数:
GET :8180/auth/realms/{realm}/protocol/openid-connect/certs
返回结果是JWK格式的公钥集合,校验Token时根据Token头部的kid字段匹配对应公钥做验签即可。
/auth/realms/{realm}/protocol/openid-connect/token:这个是核心的令牌颁发接口,纯API登录的核心逻辑就是调用这个接口,不需要任何SSR生成的临时参数,根据业务场景选择对应授权模式,用application/x-www-form-urlencoded格式POST传参即可,两种最常用场景的调用示例:- 后端服务对接(无用户参与的服务间调用):使用客户端凭证模式
POST :8180/auth/realms/{realm}/protocol/openid-connect/token Content-Type: application/x-www-form-urlencoded grant_type=client_credentials &client_id=你在Keycloak后台配置的客户端ID &client_secret=对应客户端的密钥- 自研登录页用户账号密码登录:使用密码模式
POST :8180/auth/realms/{realm}/protocol/openid-connect/token Content-Type: application/x-www-form-urlencoded grant_type=password &client_id=你在Keycloak后台配置的客户端ID &client_secret=对应客户端的密钥(公共客户端可省略该参数) &username=登录用户账号 &password=登录用户密码
注意:如果客户端开启了多因子认证(比如OTP动态码、短信验证),密码模式需要额外携带对应校验参数,复杂验证场景建议改用授权码流或者设备授权流适配。
内容的提问来源于stack exchange,提问作者KELIXO DO
相关产品推荐
相关产品推荐

