本文介绍如何把 Apriso 与飞书集成,通过飞书授权直接登录 Apriso
本文作者陈捌华,感谢捌老师倾情奉献。
OAuth2.0介绍 OAuth(Open Authorization)是一个关于授权的开放网络标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。OAuth在全世界得到广泛应用,目前的版本是2.0版。在Apriso MOM项目实施过程中也经常会碰到要求Apriso支持OAth2.0单点登录的需求。
本文以飞书平台为例,微信企业号和钉钉等平台实现方式大同小异,可以根据实际情况进行适当调整。
飞书单点登录整体流程
▶ 第一步:获取 code
详见:https://open.feishu.cn/document/common-capabilities/sso/web-application-sso/web-app-overview
应用请求用户身份验证时,需按如下方式构造授权登录页面链接,并引导用户跳转至此页面。用户在此页面确认授权之后会产生一个授权码(code),并通过 redirect_uri携带至开发者的服务器。
页面地址 :https://passport.feishu.cn/suite/passport/oauth/authorize
请求参数:
链接示例 :
https://passport.feishu.cn/suite/passport/oauth/authorize?client_id=CLIENT_ID&redirect_uri=http%3A%2F%2F127.0.0.1%3A8888&response_type=code&state=state123456
▶ 第二步:获取 access_token
详见:https://open.feishu.cn/document/common-capabilities/sso/api/get-access_token
开发者网页前端或客户端 获取 code 之后,需要把 code 传递给开发者的服务器,然后通过开发者服务器调用飞书服务器来获取可用于访问用户信息的 access_token。access_token 是开发者用户获取用户信息的唯一凭证,开发者服务器需要严格保证 access_token 的安全,并禁止把 access_token 传递给客户端。
请求方法 :POST
请求地址 :https://passport.feishu.cn/suite/passport/oauth/token
请求 Header:
字段 | 值 |
---|---|
Content-Type | application/x-www-form-urlencoded |
请求参数:
返回 Header :
字段 | 值 |
---|---|
Content-Type | application/json;charset=UTF-8 |
返回参数:
返回示例:
{
"access_token": "Q7JWnaIM_kRChuLfreHmpArjOEayt.5XUBJcZr.V0Gst4FdQCtvrd9sAViLXQnQgkpL19brGOjKZQTxb",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "oQ0mMq6MCcueAv0pwx2fQQhxqv__CbLu6G8ySFwafeKww2Def2BJdOkW3.9gCFM.LBQgFri901QaqeuL",
"refresh_expires_in": 864000
}
▶ 第三步:获取用户信息
详见:https://open.feishu.cn/document/common-capabilities/sso/api/get-user-info
开发者获取 access_token 之后,可以通过 access_token 来调用飞书服务器来获取用户信息。
请求方法 :GET
请求地址 :https://passport.feishu.cn/suite/passport/oauth/userinfo
请求 Header:
字段 | 值 |
---|---|
Authorization | Bearer ${access_token} |
返回 Header :
字段 | 值 |
---|---|
Content-Type | application/json;charset=UTF-8 |
返回参数:
返回示例:
{
"sub": "ou_caecc734c2e3328a62489fe0648c4b98779515d3",
"name": "李雷",
"picture": "https://www.feishu.cn/avatar",
"open_id": "ou_caecc734c2e3328a62489fe0648c4b98779515d3",
"union_id": "on_d89jhsdhjsajkda7828enjdj328ydhhw3u43yjhdj",
"en_name": "Lilei",
"tenant_key": "736588c92lxf175d",
"avatar_url": "www.feishu.cn/avatar/icon",
"avatar_thumb": "www.feishu.cn/avatar/icon_thumb",
"avatar_middle": "www.feishu.cn/avatar/icon_middle",
"avatar_big": "www.feishu.cn/avatar/icon_big",
"email": "zhangsan@feishu.cn",
"user_id": "5d9bdxxx",
"employee_no": "111222333",
"mobile": "+86130xxxx0000"
}
▶ 第四步:根据获取用户信息匹配Apriso用户信息
一般情况下,可以根据用户工号、邮箱、手机号和Apriso用户信息中的ExternalLogin进行匹配(本示例中使用飞书账号的open_id进行匹配,项目中根据实际情况可以选用邮箱、手机号等进行关联匹配)。
▶ 第五步:根据用户信息登录Apriso系统
需要通过客户化Apriso登录页面完成登录跳转,并且需要注意的是,只有Apriso Portal用这种方式可以很容易实现支持第三方SSO登陆。但是对于PB、DC、GPM等C/S架构程序并不能支持。
飞书配置
▶第一步,创建飞书自建应用
飞书企业管理员,进入飞书的开放平台, https://open.feishu.cn/app
点击【创建企业自建应用】按钮,创建应用。
记录App ID和App Secret
▶第二步 飞书自建应用开启网页应用功能
进入应用“添加应用能力”,添加“网页应用”能力:
▶第三步 设置重定向URL
在飞书的【安全设置】菜单,添加重定向URL地址 添加地址格式为:http://LP15-CSO5-CHN/Apriso/Portal/Kiosk/FeishuSSOLogin.aspx
▶第四步 飞书应用设置完毕,发布应用
飞书应用设置完毕后,需要发布应用,才会生效设置
登录页面开发
需要使用Visual studio单独开发一个新的登录页面,用于执行Oath2.0登录流程。
▶第一步,新建Visual studio项目AprisoOAuthLogin
▶第二步,添加引用
▶第三步,添加登录页面FeishuSSOLogin.aspx
▶第四步,根据飞书单点登录接口流程,在Page_Load中编写代码
1、 获取Code
2、 获取access_token
3、 获取用户信息
4、 匹配Apriso用户,登录系统
▶第五步,编译项目,生成AprisoOAuthLogin.dll备用
Apriso配置
▶第一步,准备
1、 准备一个Logo文件
2、 准备登录页面FeishuSSOLogin.aspx及动态链接库AprisoOAuthLogin.dll
▶第二步,修改Logon.html(Apriso 2023)
(C:\Program Files\Dassault Systemes\DELMIA Apriso 2023\WebSite\Start)
增加以下配置:
<div id="ID0Feishu" class="enumItem client"><a class="item hidden" href="javascript:openLogonWindow('FeishuSSO')">
<div style="display:inline-flex; margin-right:10px;"><img style="width:80px;height:27px;" src="FeishuLogo.svg"></div>
<div style="display:inline-block;"><h2>Feishu SSO</h2>
<p><desc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Log in By Feishu SSO.</desc></p></div></a></div>
▶第三步,修改Control.js中的openLogonWindow方法(Apriso 2023)
(C:\Program Files\Dassault Systemes\DELMIA Apriso 2023\WebSite\Start)
function openLogonWindow(method) {
var target;
switch (method) {
case 'standard':
target = "/Apriso/Portal/Kiosk/Login.aspx?BackToStartPage=true"; break;
case 'equipment':
target = "/Apriso/Portal/Kiosk/Login.aspx?BackToStartPage=true&EquipmentLogin=true"; break;
case 'windows-integrated':
target = "/Apriso/Portal/Kiosk/NTLogin.aspx"; break;
case '3ds-passport':
target = "/Apriso/Portal/Kiosk/ThreeDSPassportLogin.aspx"; break;
case 'FeishuSSO':
target = "/Apriso/Portal/Kiosk/FeishuSSOLogin.aspx"; break;
default:
return;
}
▶第四步,创建修改Web.config
(C:\Program Files\Dassault Systemes\DELMIA Apriso 2023\WebSite\Portal)
1、 增加Section
<section name="FeishuSSOClientConfig" type="AprisoOAuthLogin.FeishuSSOClientConfig, AprisoOAuthLogin" />
2、 增加Section configuration:
<FeishuSSOClientConfig AppID="***" AppSecret="***" AuthorizeUrl="https://passport.feishu.cn/suite/passport/oauth/authorize" TokenUrl="https://passport.feishu.cn/suite/passport/oauth/token" UserInfoUrl="https://passport.feishu.cn/suite/passport/oauth/userinfo" RedirectUrl="http://LP15-CSO5-CHN /Apriso/Portal/Kiosk/FeishuSSOLogin.aspx" />
其中:
AppID:应用ID(appId),需要在SSO服务器中创建应用后获取
AppSecret:应用密码,需要在SSO服务器中创建应用后获取
AuthorizeUrl:获取Code链接
TokenUrl: 获取Access_Token链接
UserInfoUrl:获取用户信息链接
RedirectUrl:SSO授权后的回调链接
▶第五步,部署文件
1、 复制FeishuLogo.svg到:C:\Program Files\Dassault Systemes\DELMIA Apriso 2023\WebSite\Start;
2、 复制FeishuSSOLogin.aspx到:C:\Program Files\Dassault Systemes\DELMIA Apriso 2023\WebSite\Portal\Kiosk
3、 复制FeishuOAuthLogin.dll到:C:\Program Files\Dassault Systemes\DELMIA Apriso 2023\WebSite\Portal\bin
测试
▶第一步,验证登录选项页面
▶第二步,验证飞书单点登录
1、如果浏览器尚未登录飞书账号,则自动跳转到扫描二维码登录页面,通过手机飞书APP扫描二维码实现登录
2、如果浏览器已经登录飞书账号,则可以直接点击“授权”进行单点登录