主要内容

  • 密码认证
  • 授权码认证 哪个client申请的code,使用哪个client获取token
  • 客户端认证 在kc开通了服务端帐号之后,可通过client_id和client_secret来获取token,与用户无关,无刷新token机制
  • 自动触发社区认证 当用户在社区网站上登录后,访问这个地址可自动登录法宝
  • 验证token是否在线 可使用任意client来验证所有token的在线性
  • refresh_token刷新token 哪个client生成的token,就用哪个client去刷新
  • 登出/注销 官方post方式和浏览器302方式

密码认证

  • POST /auth/realms/your-realm/protocol/openid-connect/token
  • 请求体 x-www-form-urlencoded
grant_type:password
username:test
password:123456
client_secret:ec0fd1c6-68b0-4c39-a9fa-c3be25c8ef01
client_id:democlient
  • 响应
{
"access_token": "*.*.*",
"expires_in": 3000,
"refresh_expires_in": 1800,
"refresh_token": "*.*.*",
"token_type": "bearer",
"not-before-policy": 1619512543,
"session_state": "765969ec-94da-4edb-9dcb-e15ea3e0ad3b",
"scope": "roles email profile"
}

授权码认证

注意的几点

  • code时的redirect_uri和authorization_code的需要是一致的,不一致的错误
{
"error": "invalid_grant",
"error_description": "redirect_uri error"
}
  • code时的client_id和client_secret和authorization_code的需要是一致的,不一致的错误,这块我已经修改了源码,去掉了这个限制

    {

    "error": "invalid_grant",

    "error_description": "Auth error"

    }
  • code的组成

    它由3部分组成,中间使用.分割,第一部分是UUID,第二部分是用户会话ID【session_state】,第三部分是客户端ID,例如:
5c33f9a2-cbf4-4804-a8ee-e2d076eda2d6.40be5301-f41b-4f0d-97e7-d2074db2801c.ff591897-7654-460e-9c19-8e8f92117768

请求code

  • GET /auth/realms/your-realm/protocol/openid-connect/auth
  • QUERY
client_id:democlient
scope:openid
response_type:code
client_secret:ec0fd1c6-68b0-4c39-a9fa-c3be25c8ef01
redirect_uri:http://localhost:9090/callback
  • 跳转到kc的登录页,完成用户名和密码的登录

  • 登录成功之后,跳回callback删除,在url参数上带上了code

请求token

  • POST /auth/realms/your-realm/protocol/openid-connect/token
  • 请求体 x-www-form-urlencoded
grant_type:authorization_code
code:68058719-add6-4b40-ab96-8e71af03827a.7a31b1a9-c3e8-46d4-b8cc-345012fcf4a2.25e52f60-5991-43dd-9108-873f60af385d
client_id:democlient
client_secret:ec0fd1c6-68b0-4c39-a9fa-c3be25c8ef01
scope:openid
redirect_uri:http://localhost:9090/callback
  • 响应
{
"access_token": "*.*.*",
"expires_in": 3000,
"refresh_expires_in": 1800,
"refresh_token": "*.*.*",
"token_type": "bearer",
"id_token": "*.*.*",
"not-before-policy": 1619660302,
"session_state": "14812f50-b9f7-4cee-be56-bf9bef5c961a",
"scope": "openid roles email profile"
}

客户端认证

客户端认证,与用户无关,主要保证向keycloak发起的请求,来自合法的client即可(由keycloak颁发的client)

  • POST /auth/realms/your-realm/protocol/openid-connect/token
  • 请求 x-www-form-urlencoded
  • 参数
grant_type:client_credentials
client_secret:912ecc47-60b1-4dd4-8f62-c7745c293cab
client_id:kce
  • 注意,需要在keycloak客户端配置开启服务账号

  • 如果没有开启服务账号,将出现下面异常
{
"error": "unauthorized_client",
"error_description": "Client not enabled to retrieve service account"
}

自动触发社区认证

carsi中出现的东西,院校希望直接通过固定的uri实现社区登录,故开发这个功能

  • 这个里的重定向认证使用的认证流是carsi

  • 其次,需要新添加客户端,专门用来发送社区自动认证请求的,如carsi-auto,或者配置客户端的自定义认证方式

  • 最后,测试一下,你可以看到,通过这个地址,可以唤起社区登录,最后回调到我们OIDC认证上来

验证token是否在线

是否触发了keycloak的logout接口,如果触发了,那token将被删除,在线状态active为false,如果不希望提供client_secret参数,也可以通过/auth/realms/your-realm/protocol/openid-connect/userinfo接口来判断token是否有效,httpcode为401表示token失效.

  • 使用场景:a客户端在kc申请的token,可以在b客户端调用kc的接口去校验它的合法性
  • POST /auth/realms/your-realm/protocol/openid-connect/token/introspect
  • 请求体 x-www-form-urlencoded
token:*.*.*
client_id:democlient
client_secret:ec0fd1c6-68b0-4c39-a9fa-c3be25c8ef01
  • 响应,状态码都是200,如果json体中active为false,表示已经离线
{
"active": false
}

refresh_token刷新token

注意,刷新token与客户端有关,自己客户端生产的access_token,只能由自己客户端去refresh_token刷新

  • POST /auth/realms/your-realm/protocol/openid-connect/token
grant_type:refresh_token
refresh_token:*.*.*
client_id:democlient
client_secret:ec0fd1c6-68b0-4c39-a9fa-c3be25c8ef01
  • 响应

    新的token对象
{
"access_token": "*.*.*",
"expires_in": 3000,
"refresh_expires_in": 1800,
"refresh_token": "*.*.*",
"token_type": "bearer",
"not-before-policy": 1621497420,
"session_state": "405d25b0-5128-45ae-9934-953eecb79894",
"scope": "roles profile"
}

登出/注销

KC的登出是属于会话的登出,通过这个会话产生的所有token(一个会话可能对应多个不同client的token)都将会退出

一般地,如果是前后不分享项目,应该还会清除自己网站的session会话,然后再去调用KC的接口

  • POST /auth/realms/your-realm/protocol/openid-connect/logout
  • 请求体 x-www-form-urlencoded
refresh_token:*.*.*
client_id:democlient
client_secret:ec0fd1c6-68b0-4c39-a9fa-c3be25c8ef01
  • 响应
HttpCode为200或者204表示操作成功
  • 浏览器端可通过这个接口来实现302浏览器跳转方式的登出
GET /auth/realms/your-realm/sms/remove-sessions?redirect_uri={redirect_uri}
登出后,KC会跳转到redirectUri的页面

keycloak~认证与校验使用说明的更多相关文章

  1. jenkins 集成 keycloak 认证

    keycloak 是很不错的sso 工具,当然也有Jenkins 的插件,我们可以使用jenkins 插件,方便用户账户的管理 环境准别 docker-compose version: "3 ...

  2. 【JEECG技术文档】Online唯一校验使用说明

    1.功能介绍 配置了唯一校验的字段,在录入和编辑页面中,动态查询用户输入值是否存在校验. 要使用online唯一校验功能必须先在online表单开发中配置唯一字段的校验方式为唯一校验. 2.配置唯一校 ...

  3. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  4. 双向认证 HTTPS双向认证

    [微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3 HTTPS双向认证使用说明 ...

  5. java jvm学习笔记七(jar包的代码认证和签名)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...

  6. shiro基础学习(二)—shiro认证

    一.shiro简介      shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证.权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. 以下 ...

  7. 使用微服务架构思想,设计部署OAuth2.0授权认证框架

    1,授权认证与微服务架构 1.1,由不同团队合作引发的授权认证问题 去年的时候,公司开发一款新产品,但人手不够,将B/S系统的Web开发外包,外包团队使用Vue.js框架,调用我们的WebAPI,但是 ...

  8. Django学习之九: auth 认证组件

    目录 Django auth 认证组件 配置使用auth组件及其中间件 request.user 可以直接在template模版中使用 auth组件常用api 获取认证model类 认证检测装饰器@l ...

  9. drf视图组件、认证组件

    视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...

  10. 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我们介绍了网关使用Redis进行缓存,并介绍了如何进行缓存实现,缓存信息清理接口的使用.本篇我们将介绍如何实现网关自定义客户端授权, ...

随机推荐

  1. 如何使用CRM管理不同发展阶段的医药代表

    通过医药代表,医生可以获得该产品的全面指导和信息.通过这一类医药代表的筛选,产品信息被有效的分类和翻译,变成了医生的"用药词典",给医生在使用该产品的过程中,提供了快捷准确的信息服 ...

  2. 下列哪个选项是对 WebSocket 的正确描述?

    A.  一种扩展 HTTP 的协议,通信消息以 XML 格式描述. B.  使用 http或https作为URI连接的前缀,并使用与HTTP和HTTPS相同的端口号进行通信. C.  它是一种双向通信 ...

  3. [原创] Realtek RTL8195A WIFI历史漏洞分析和新漏洞挖掘

    前言 本文主要分析vdoo发现的一些RTL8195A WIFI模块的漏洞. 环境搭建 下载最新的SDK https://github.com/ambiot/amb1_arduino/blob/mast ...

  4. SQLServer无法远程连接的解决方法

    ​服务器端: 打开SQLServer配置管理器 - SQLServer 网络配置- MSSQLSERVER的协议-TCP/IP 启用 运行输入Services.msc,重启MSSQLSERVER服务. ...

  5. 两个 F# 的 MVVM

    fsprojects/Avalonia.FuncUI: Develop cross-plattform GUI Applications using F# and Avalonia! fabulous ...

  6. windows 也支持右键复制文件名了

    mac 有一个操作,alt + 右键,出现的菜单有复制路径一项.不用羡慕,现在 windows 也有这个功能了. Shift + 右键,"复制为路径":

  7. 【MyBatis】学习笔记15:通过分步查询解决一对多或多对多问题

    目录 对象 SmbmsProvider.java SmbmsBill.java 接口 providerMapper.java orderMapper.java 映射文件 providerMapper. ...

  8. Netty 缓存buffer介绍及使用

    每当你需要传输数据时,它必须包含一个缓冲区.Java NIO API 自带的缓冲区类是相当有限的,没有经过优化,使用 JDK 的ByteBuffer 操作更复杂.缓冲区是一个重要的组建,它是 API的 ...

  9. MYSQL支持的数据类型-数值类型

    一.数值类型分类 MYSQL支持所有标准SQL中的数值类型,其中包括严格数值类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT.REAL和DOU ...

  10. Sealos Devbox 基础教程:使用 Cursor 从零开发一个代码猜古诗小游戏

    给你一段代码,让你根据代码来猜对应的古诗词,你能猜对吗? 这不是玩笑,还真有人这么干 这是一张在 1024 程序员节流传的代码猜诗句小游戏,相信很多程序员小朋友都看到过. 今天我们将用魔法打败魔法,通 ...