oauth 2.0 服务端可以参考文章: Spring Security oauth2.0 服务端
优势
- 够减少密码输入疲劳,免去多系统多账号密码的烦劳
- 减少登录次数,提高工作效率
- 为系统管理人员工作提供便利,如员工离职,系统管理员能够撤消任何用户对所有应用程序的访问权限
- 简化业务系统的开发成本,业务系统无需实现登录校验逻辑
- 统一用户管理,用户信息来源一致
- 优化用户跟踪审计,可根据不同应用程序跟踪用户以进行审计和记录
客户端注册
创建表 oauth_client_details 用来存储客户端信息
CREATE TABLE `oauth_client_details` (
`client_id` VARCHAR ( 256 ) CHARACTER
SET utf8 NOT NULL,
`resource_ids` VARCHAR ( 256 ) CHARACTER
SET utf8 DEFAULT NULL,
`client_secret` VARCHAR ( 256 ) CHARACTER
SET utf8 DEFAULT NULL,
`scope` VARCHAR ( 256 ) CHARACTER
SET utf8 DEFAULT NULL,
`authorized_grant_types` VARCHAR ( 256 ) CHARACTER
SET utf8 DEFAULT NULL,
`web_server_redirect_uri` VARCHAR ( 256 ) CHARACTER
SET utf8 DEFAULT NULL,
`authorities` VARCHAR ( 256 ) CHARACTER
SET utf8 DEFAULT NULL,
`access_token_validity` INT ( 11 ) DEFAULT NULL,
`refresh_token_validity` INT ( 11 ) DEFAULT NULL,
`additional_information` VARCHAR ( 4096 ) CHARACTER
SET utf8 DEFAULT NULL,
`autoapprove` VARCHAR ( 256 ) CHARACTER
SET utf8 DEFAULT NULL,
PRIMARY KEY ( `client_id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8;
- client_id:主键,必须唯一,不能为空.
- resource_ids:设置 client 可以访问哪些资源服务,如果没设置,则可以访问所有,多个资源时用逗号(,)分隔
- client_secret:指定客户端(client)的访问密匙,加上 {noop} 表示不加密,如 {noop}123
- scope:指定客户端申请的权限范围,可选值包括read、write,、rust;若有多个权限范围用逗号(,)
- authorized_grant_types:指定客户端支持的 grant_type,可选值包括authorization_code、password,refresh_token、implicit、client_credentials, 若支持多个grant_type用逗号(,)分隔
- web_server_redirect_uri:客户端的重定向URI,可为空,多个则用逗号隔开
- authorities:客户端所拥有的 Spring Security 的权限值,类似于角色,若有多个权限值用逗号(,)分隔
- access_token_validity 设定客户端的 access_token 的有效时间值(单位:秒),若不设定值则使用默认的有效时间值(60 * 60 * 12, 12小时)
- refresh_token_validity:设定客户端的refresh_token的有效时间值(单位:秒),若不设定值则使用默认的有效时间值(60 * 60 * 24 * 30, 30天);若客户端的 grant_type 不包括 refresh_token,则不用关心该字段
- additional_information:这是一个预留的字段,在 Oauth 的流程中没有实际的使用,但若设置值,必须是JSON格式的数据
- autoapprove:设置用户是否自动 Approval 操作,默认值为 ‘false’,可选值包括 ‘true’,‘false’, ‘read’,‘write’.
该字段只适用于 grant_type=“authorization_code” 即授权码的情况,当用户登录成功后,若该值为’true’或支持的scope值,则会跳过用户 Approve 的页面, 直接授权.
添加两个客户端,wms 和 crm
单点登录流程
首次登录
登录流程
登录步骤
- 用户请求登录 WMS
- WMS 前端向单点登录服务发送请求
GET 请求,参数使用 form 表单提交
http://localhost:8055/oauth/authorize?response_type=code&client_id=wms&redirect_uri=http://localhost:8083/test/login&scope=all
参数 | 值 | 必填 |
---|---|---|
response_type | 固定传 code | 是 |
client_id | 客户端 id | 是 |
redirect_uri | 登录成功后回调的地址, | 是 |
scope | 根据配置填写 | 是 |
3、单点登录服务判断该用户首次登录,重定向到登录界面
4、用户在输入账号 、密码,点击登录
5、验证登录成功后,重定向到 redirect_uri 参数指定的网址( http://localhost:8081/wms)。跳转成功后,获取 code 授权码
http://localhost:8081/wms?code=cIlQAq
6、拿到授权码后,向单点登录服务发送获取 token 请求
POST 请求,参数使用 form 表单提交
localhost:8055/oauth/token?grant_type=authorization_code&client_id=wms&client_secret=TGgxxvGWUTx7JnOBfujl8zYD2a3GjOM3&code=cIlQAq&redirect_uri=http://localhost:8081/wms
参数 | 值 | 必填 |
---|---|---|
client_id | deliver | 是 |
client_secret | 配置在数据库表 oauth_client_details | 是 |
grant_type | 固定传 authorization_code | 是 |
code | 授权码,从步骤5获取 | 是 |
redirect_uri | 回调地址,和第2步传入的 redirect_uri 一致 | 是 |
至此,WMS 系统成功获取单点登录服务 token,成功登录
已登录
场景:经过上述步骤,用户已成功登录 WMS 系统,现用户再登录 CRM 系统,不需要输入账号密码,直接进入 CRM 系统
登录流程
登录步骤
- 用户请求登录 CRM
- CRM 前端向单点登录服务发送请求
GET 请求,参数使用 form 表单提交
http://localhost:8055/oauth/authorize?response_type=code&client_id=crm&scope=all&redirect_uri=http://localhost:8082/crm
- 单点登录服务判断该用户已登录,重定向到 redirect_uri 参数指定的网址( http://localhost:8082/crm)。跳转成功后,获取 code 授权码
http://localhost:8082/crm?code=VhfYDT
6、拿到授权码后,向单点登录服务发送获取 token 请求
POST 请求,参数使用 form 表单提交
localhost:8055/oauth/token?grant_type=authorization_code&client_id=crm&client_secret=TGgxxvGWUTx7JnOBfujl8zYD2a3GjOM3&code=VhfYDT&redirect_uri=http://localhost:8082/crm
至此,CRM 系统成功获取单点登录服务 token,成功登录