Appearance
单点登录
概述
单点登录(SingleSignOn,SSO),允许织信使用第三方的认证服务,对用户进行认证。有以下两种认证过程。
- 在织信登录页面发起,在用户输入账号、密码后,调用第三方系统去认证。
- 在第三方系统页面发起,调用织信API去认证。
织信登录页面发起
触发时机:在用户输入账号、密码后触发 配置条件:
- 在新创建的应用或者已有的应用里,找到应用设计->脚本,并创建systemhook.js文件(脚本名称可以自定义) 在systemhook.js文件里实现sso方法,处理认证的业务逻辑
javascript
export function login(ctx) {
console.log("ctx parameters:", ctx.userName, ctx.password, ctx.ip, ctx.type)
//todo 认证
return {
'success': true
}
}
login函数输入参数ctx
id 描述 userName 用户名(可能是手机号或邮箱) password 密码 ip ip地址 type 登录类型 index,mobile login函数返回值
id 描述 success 认证是否成功 message 错误信息,如果成功可以不用返回 在织信管理后台(/guide/admin)->系统信息->参数设置里找到以下参数并设置
- 系统钩子应用ID
- 系统钩子应用所属团队的数据存储数据库索引
- 系统钩子脚本路径
- 织信登录页面发起的SSO登录函数
- 第三方页面发起的SSO登录函数
TIP
system.systemHookDbIndex 如果业务数据库只有一个那么值为0
怎么找到第一步应用的ID? 在工作台找到应用管理按钮 点击应用管理按钮,在应用列表里找到第一步的应用,点击设置 在应用信息里找到appid
- system.systemHookScriptPath 填入第一步创建的脚本路径(systemhook.js)
示例通过ldap认证的单点登录
javascript
export function login(ctx) {
console.log("ctx", ctx.userName, ctx.password, ctx.ip, ctx.type)
// const success=informat.user.passwordAuth(ctx.userName,crx.password);
const userName = ctx.userName;
const password = ctx.password;
let connection = null;
try{
connection = informat.ldap.connect({
providerURL:'LDAP://1.13.173.190:389',
securityPrincipal: userName,
securityCredentials: password
})
} catch(e) {
//连接ldap服务器或者认证失败
console.error('ldap login failure:', userName);
return {
success: false,
message: '登录失败' //登录失败提示语
}
} finally {
if (connection != null) {
connection.close();
}
}
return {
success: true
}
}
SSO第三方页面发起
sso登录流程
- 第三方服务http请求织信sso服务地址:
https://next.informat.cn/account/main/sso
- 织信sso服务调用sso函数授权
在新创建的应用或者已有的应用里,找到应用设计->脚本,并创建systemhook.js文件(脚本名称可以自定义) 在systemhook.js文件里实现sso方法,处理授权前的业务逻辑
javascript
export function sso(ctx) {
console.log("ctx parameters:", ctx)
//TODO 认证获取accountId
return {
accountId: 'x38s0fa436v69',
success: true,
redirectUrl: '/workbench/app',
}
}
- sso函数输入参数ctx
属性 | 类型 | 说明 |
---|---|---|
headers | Object | http请求头 |
cookies | Object | http cookies |
query | Object | 查询参数 |
body | String | http请求body |
url | String | http请求地址 |
path | String | path |
method | String | 请求方法 |
ip | String | ip地址 |
- sso函数返回值
属性 | 类型 | 说明 |
---|---|---|
accountId | String | 授权账号ID |
success | Boolean | 是否授权成功 |
message | String | 错误信息 |
redirectUrl | String | 授权后跳转地址 |
示例:
javascript
export function sso(ctx) {
console.log('ctx------>', informat.utils.toJSON(ctx));
const query = ctx.query;
const userName = query.userName;
const password = query.password;
//通过用户名查找账号
var accountList = informat.system.queryAccountList({
filter: {
conditionList: [{ 'fieldId': 'userName', 'opt': 'eq', 'value': query.userName }]
}
});
console.log('accountList', accountList);
if (accountList.size() == 0) {
return {
success: false,
message: '账号不存在'
};
}
//这里使用织信账号密码鉴权,实际中可以按照自己的业务逻辑去鉴权
var result = informat.system.validateAccount(userName, password);
if (!result) {
return {
success: false,
message: '账号密码错误'
};
}
return {
accountId: accountList[0].id,
success: true,
redirectUrl: '/workbench/app'
};
}