1.单点登录需求(健帆项目为例)
根据健帆项目需求,目前基于Oauth2认证来实现单点登录,通过同一员工实现各系统,一次登录后自动授权跳转。
其中泛微OA(PC端、app端)作为用户登录入口,中台系统作为用户接入方,访客系统、海康系统、饭堂系统作为中台系统下的应用。
用户访问流程如下:
2.实现方式
2.1 各系统已同步用户信息(泛微OA对接)
用于泛微OA用户登录后跳到中台系统,同时支持跳到中台系统下面的应用详情页面。
2.1.1 用户时序图
2.1.2 对接接口(PC端/Android/IOS端)
2.1.2.1签名方法
ClientId值:jafron(实际项目联系中台人员获取)
SecureKey值:(实际项目联系中台人员获取)
时间缀为:1651051730859
客户端请求接口:/oauth2/authorize,
参数(body)为:
{"empNo":"000000001"}
签名方式为:md5(body + timestamp + secureKey)。
将参数(body)转字符串得到:
‘{"empNo":"000000001"}’
使用拼接时间戳以及密钥得到:{“empNo”:”000000001”}1651051730859【SecureKey值】
使用md5(“{“empNo”:”000000001”}1651051730859【SecureKey值】”)得到6ac9cedfe3fab00b79f56e82b2bd3076
示例:
测试服务地址:http://pai.flyrise.cn/auth-api
POST /oauth2/authorize
header: X-Client-Id: jafron
header: X-Timestamp: 1651051730859
header: X-Sign: 6ac9cedfe3fab00b79f56e82b2bd3076
body:{"empNo":"000000001"}
2.1.2.2获取授权码
接口说明:该接口主要是用于登录前获取授权码,获取到授权码后才能调用登录接口获取到用户凭证。
请求地址:
测试服务地址:http://pai.flyrise.cn/auth-api
Method:post
URI: /oauth2/authorize
备注:获取授权码
请求参数样例:
header 参数
参数名 | 参数key | 描述 | 示例 |
---|---|---|---|
时间戳 | X-Timestamp | 13位时间戳 | 例如:1651040905547 |
客户端id | X-Client-Id | clientId | 例如:jafron |
签名 | X-Sign | 数据签名 | 例如:cde98037e68a2a01b80fc8d1acacd8c4 |
body 参数
{"empNo":"000000001"}
返回数据:
{
"code":"200",
"data":{
"code":"y137bp94",
"expire":300
},
"time":1651040906280,
"msg":"操作成功",
"annex":null,
"success":true
}
返回参数解析
参数名 | 参数key | 描述 | 示例 |
---|---|---|---|
授权码 | code | 授权码 | 例如:y137bp94 |
过期时间 | expire | 过期时间 | 例如:300 |
2.1.2.3获取返回登录token
接口说明:该接口通过授权码获取用户凭证。
请求地址:
测试服务地址:http://pai.flyrise.cn/auth-api
Method:post
URI: /oauth2/token
备注:获取用户凭证
请求参数样例:
header 参数
参数名 | 参数key | 描述 | 示例 |
---|---|---|---|
时间戳 | X-Timestamp | 13位时间戳 | 例如:1651051730859 |
客户端id | X-Client-Id | clientId | 例如:jafron |
签名 | X-Sign | 数据签名 | 例如:381d3b1fa986401049785139eeed0f97 |
body 参数
参数名 | 参数key | 描述 | 示例 |
---|---|---|---|
授权码 | code | 从授权码接口获取 | 例如:y137bp94 |
平台 | platform | web,mobile (目前只有两种分类,分别用于pc和移动端) | 例如:jafron |
{"code":"y137bp94","platform":"web"}
返回数据:
{
"code":"200",
"data":{
"st":"yUDN2MjMwcDZwYWMtIDNjhTLhJjY00CZ1AjZtUGZjhjZxYjM"
},
"time":1651052155679,
"msg":"操作成功",
"annex":null,
"success":true
}
返回参数解析
参数名 | 参数key | 描述 | 示例 |
---|---|---|---|
token | st | token | 例如:yUDN2MjMwcDZwYWMtIDNjhTLhJjY00CZ1AjZtUGZjhjZxYjM |
2.1.3 跳转路径
2.1.3.1 PC端
获取到的token 可以直接在pc 端使用,例如直接浏览器打开:https://pai.flyrise.cn/workbench?st=yUDN2MjMwcDZwYWMtIDNjhTLhJjY00CZ1AjZtUGZjhjZxYjM
2.1.3.2 移动端
APP传参数
参数名 | 参数类型 | 描述 | 示例 |
---|---|---|---|
st | String | token | 例如:yUDN2MjMwcDZwYWMtIDNjhTLhJjY00CZ1AjZtUGZjhjZxYjM |
type | String | 操作类型,不传去到登录页 | 例如:open_micro |
code | String | 页面标识:MicroAppCode |
例如:1450744642503708672 |
biz | String | 传参,json 字符串 |
例如:"{t:\"标题\",c:\"内容\"}" |
协议头:
paispcloud
(凌云、园圈P+
)APP
ip
:cn.flyrise.spcloud
端口:
8088
目录:
schemaView
参数:
st
、type
、code
、biz
paispcloud://cn.flyrise.spcloud:8088/schemaView?type=open_micro&st=yUDN2MjMwcDZwYWMtIDNjhTLhJjY00CZ1AjZtUGZjhjZxYjM&code=1450744642503708672&biz=333
H5
打开
<a class="link-layout" target="_blank" :href="`paispcloud://cn.flyrise.spcloud:8088/schemaView?type=open_micro&st=yUDN2MjMwcDZwYWMtIDNjhTLhJjY00CZ1AjZtUGZjhjZxYjM&code=1450744642503708672&biz=333`" style="text-decoration: none;">
<text class="button">打开APP</text>
</a>
安卓
打开
val url= "paispcloud://cn.flyrise.spcloud:8088/schemaView?type=open_micro&st=yUDN2MjMwcDZwYWMtIDNjhTLhJjY00CZ1AjZtUGZjhjZxYjM&code=1450744642503708672&biz=333"
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(intent)
iOS
打开
NSString *urlstr = @"paispcloud://cn.flyrise.spcloud:8088/schemaView?type=open_micro&st=yUDN2MjMwcDZwYWMtIDNjhTLhJjY00CZ1AjZtUGZjhjZxYjM&code=1450744642503708672&biz=333";
NSURL *handlbackeUrl = [NSURL URLWithString:urlstr];
[[UIApplication sharedApplication] openURL:handlbackeUrl];
2.2 各系统未同步用户信息(海康系统、饭堂系统对接)
用于中台系统用户,跳到子应用,包括访客系统、海康系统、饭堂系统等。
2.2.1 用户时序图
2.2.2 对接接口(PC端/Android/IOS端)
功能:获取用户信息接口对接
测试服务地址:http://pai.flyrise.cn/auth-api
请求地址: /oauth2/user
请求类型:POST
请求参数:Header
名称 | 类型 | 是否必须 | 备注 |
---|---|---|---|
Authorization | Header | true | 用户 |
token 请求示例: Authorization: bearer c6862aca-0e0e-48f8-bfd4-823d4edc903d
回应结果:
回应参数说明:
名称 | 类型 | 备注 |
---|---|---|
username | String | 用户名 |
authorities | List | 权限列表 |
userId | String | 用户 id |
entId | String | 当前企业 id |
{
"code":"200",
"data":{
"password":null,
"username":"13012345678",
"authorities":[
{
"authority":"ROLE_ent_admin"
},
{
"authority":"ROLE_normal"
},
{
"authority":"ROLE_park_admin"
},
{
"authority":"ent_admin:cons_application"
},
{
"authority":"ent_admin:cons_book"
},
{
"authority":"ent_admin:cons_config"
},
{
"authority":"ent_admin:cons_info_manager"
},
{
"authority":"ent_admin:cons_portal"
},
{
"authority":"ent_admin:cons_security"
}
],
"accountNonExpired":true,
"accountNonLocked":true,
"credentialsNonExpired":true,
"enabled":true,
"userId":"1309331342693109760",
"nickName":"开发测试管理员",
"deptId":"1333317403593019392",
"entId":"1309331342667943936",
"platform":null,
"openId":null,
"parkId":"1433617920071446528",
"parkCode":"tknf5bswt",
"parkName":"产品开发测试园区【沙箱】",
"deptName":"测试小组",
"entName":"开发测试企业",
"staffId":"1309331342793773056",
"staffName":"薛晨测",
"phoneNumber":"13012345678",
"version":null,
"avatar":"a254c3de15e04e6d814f66862a761232"
},
"time":1646299890457,
"msg":"操作成功",
"annex":null,
"success":true
}
备注:如果有st换取token情况:先反转字符串然后Base64解码
方法1.
window.atob(st.split(‘’).reverse().join(‘’))
方法2.
#建议先锁定npm安装版本
#npm config set save-prefix=’’
npm install @flyriselink/pai-auth-api
import { decrypt } from ‘@flyriselink/pai-auth-api’
let 解 = decrypt(st)