keycloak~认证与校验使用说明
主要内容
- 密码认证
- 授权码认证
哪个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实现社区登录,故开发这个功能
- 地址:GET https://kc.democlient.com/auth/realms/your-realm/protocol/openid-connect/auth?scope=openid&response_type=code&client_id=carsi-auto&redirect_uri=https://www.baidu.com
- 首先,需要在配置
Authentication Flows
中的brower中的社区登录的有限级最高,我们可以复制一个brower认证流,在新流上修改,用户密码认证步骤关闭,也可以删除
- 这个里的重定向认证使用的认证流是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~认证与校验使用说明的更多相关文章
- jenkins 集成 keycloak 认证
keycloak 是很不错的sso 工具,当然也有Jenkins 的插件,我们可以使用jenkins 插件,方便用户账户的管理 环境准别 docker-compose version: "3 ...
- 【JEECG技术文档】Online唯一校验使用说明
1.功能介绍 配置了唯一校验的字段,在录入和编辑页面中,动态查询用户输入值是否存在校验. 要使用online唯一校验功能必须先在online表单开发中配置唯一字段的校验方式为唯一校验. 2.配置唯一校 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- 双向认证 HTTPS双向认证
[微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3 HTTPS双向认证使用说明 ...
- java jvm学习笔记七(jar包的代码认证和签名)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...
- shiro基础学习(二)—shiro认证
一.shiro简介 shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证.权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. 以下 ...
- 使用微服务架构思想,设计部署OAuth2.0授权认证框架
1,授权认证与微服务架构 1.1,由不同团队合作引发的授权认证问题 去年的时候,公司开发一款新产品,但人手不够,将B/S系统的Web开发外包,外包团队使用Vue.js框架,调用我们的WebAPI,但是 ...
- Django学习之九: auth 认证组件
目录 Django auth 认证组件 配置使用auth组件及其中间件 request.user 可以直接在template模版中使用 auth组件常用api 获取认证model类 认证检测装饰器@l ...
- drf视图组件、认证组件
视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...
- 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权
[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我们介绍了网关使用Redis进行缓存,并介绍了如何进行缓存实现,缓存信息清理接口的使用.本篇我们将介绍如何实现网关自定义客户端授权, ...
随机推荐
- 2-SQL注入渗透与攻防
1.SQL注入基础 1.1 什么是sql注入 一.SQL注入概述 二.数据库概述 1.关系型数据库 关系型数据库,存储格式可以直观的反映实体间的关系,和常见的表格比较相似 关系型数据库中表与表之间有很 ...
- 开源的 Linux 游戏平台「GitHub 热点速览」
<越狱>.<迷失>.<西部风云>等经典美剧背后的民间字幕翻译团队--人人影视,由于 AI 翻译的崛起.官方中文字幕的普及和版权问题,最终决定以开源的方式,为这段旅程 ...
- 微信开发者工具请求接口 Provisional headers are shown
前情 最近全权负责公司小程序项目的开发,使用的uniapp技术栈. 坑 在和服务端联调的时候发现,接口pending很久,而且时不时的报Provisional headers are shown,而且 ...
- Centos更改SSH端口的方法
1,vi sshd vi /etc/ssh/sshd_config 2,添加PORT #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress ...
- Qt编写物联网管理平台38-多种数据库支持
一.前言 本系统设计之初就要求支持多种不同的数据库,比如sqlite.mysql.postgres.sqlserver等,甚至包括国产数据库比如人大金仓kingbase等,(由于现在国产化的大力推进, ...
- Matlab R2009b 版 license 到期问题
打开2009b Matlab,反复提示需要激活,是lisense到期了,到期时间2017年11月11日.解决方法: 将以下内容替换 Matlab 安装路径下 license/*.lic 文件中的所有内 ...
- [转]java中带图片按钮的大小设置
在java部分需要用到图形界面编程的项目中,经常会使用图片设置对按钮进行美化,但是使用时会出现一个很麻烦的问题,那就是按钮的大小默认按照图片的大小来显示,这大大降低了界面的美观程度: 按照方法: JB ...
- 移动端弱网优化专题(十四):携程APP移动网络优化实践(弱网识别篇)
本文由携程技术团队Aaron分享,原题"干货 | 携程弱网识别技术探索",下文进行了排版和内容优化. 1.引言 网络优化一直是移动互联网时代的热议话题,弱网识别作为移动端弱网优化的 ...
- react学习之antd
antd 为 Web 应用提供了丰富的基础 UI 组件,我们还将持续探索企业级应用的最佳 UI 实践.它最初是基于 React 的组件库,但随着技术的发展,现在也提供了基于 Vue.js 的版本--A ...
- Windows环境配置Nginx服务实现负载均衡
系统环境:win10 测试服务:.net6.0+webapi 一.本地创建一个webapi项目 二.新建一个api控制器,里面编写一个测试方法 三.我直接把这一个项目复制了3份,然后修改控制器方法中的 ...