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+

APPipcn.flyrise.spcloud

端口:8088

目录:schemaView

参数:sttypecodebiz

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)

文档更新时间: 2022-11-29 11:32   作者:曾小虎