Skip to content

单点登录

概述

单点登录(SingleSignOn,SSO),允许织信使用第三方的认证服务,对用户进行认证。有以下两种认证过程。

  • 在织信登录页面发起,在用户输入账号、密码后,调用第三方系统去认证。
  • 在第三方系统页面发起,调用织信API去认证。

SSO过程

织信登录页面发起

触发时机:在用户输入账号、密码后触发 配置条件:

  • 在新创建的应用或者已有的应用里,找到应用设计->脚本,并创建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密码
    ipip地址
    type登录类型 index,mobile
  • login函数返回值

    id描述
    success认证是否成功
    message错误信息,如果成功可以不用返回
  • 在织信管理后台(/guide/admin)->系统信息->参数设置里找到以下参数并设置

    • 系统钩子应用ID
    • 系统钩子应用所属团队的数据存储数据库索引
    • 系统钩子脚本路径
    • 织信登录页面发起的SSO登录函数
    • 第三方页面发起的SSO登录函数

TIP

system.systemHookDbIndex 如果业务数据库只有一个那么值为0

怎么找到第一步应用的ID? 在工作台找到应用管理按钮 应用管理 点击应用管理按钮,在应用列表里找到第一步的应用,点击设置 应用设置 在应用信息里找到appid 应用信息

  1. 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
属性类型说明
headersObjecthttp请求头
cookiesObjecthttp cookies
queryObject查询参数
bodyStringhttp请求body
urlStringhttp请求地址
pathStringpath
methodString请求方法
ipStringip地址
  • sso函数返回值
属性类型说明
accountIdString授权账号ID
successBoolean是否授权成功
messageString错误信息
redirectUrlString授权后跳转地址

示例:

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'
    };
}