关键词:系统集成,O2OA,SSO,单点认证,认证集成,约定密钥
O2OA平台提供灵活的系统集成方案,让企业信息平台与各类第三方系统进行集成。本篇主要介绍如何在O2OA中使用简单的约定密钥的方案与其他系统实现单点登入。
O2OA提供多种单点认证配置,如约定密钥的单点认证配置,OAuth2客户端与服务端配置支持。本文主要讲解如果使用约定密钥实现外部系统与O2OA的单点认证。
关于用户账号同步
通过单点认证的系统中拥有统一的用户登录账号,或者进行某种账号映射是单点认证登录设置的基础。
**
单点认证配置入口
在系统菜单-控制面板-系统设置中定制您的系统。点击系统菜单,找到“系统SSO配置”,点击打开
**
约定密钥的单点认证
在控制面板 - 系统设置 - 基础配置 - 系统SSO配置界面添加一个SSO配置:
当然也可以在服务器配置文件:o2server/config/token.json中进行配置,如果config目录中没有该配置文件,可以从o2server/configSample目录中拷贝文件token.json到o2server/config目录后再进行配置文件修改
"ssos": [
{
"enable": true,
"client": "ERP",
"key": "password"
}
],
参数配置:
"enable": "是否启用",
"client": "名称",
"key": "密钥"
数据加密工具类(Java)
Crypto.java
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
/**
* encrypt and decrypt utils
* @author O2OA
*
*/
public class Crypto {
private static final String utf8 = "UTF-8";
private final static String DES = "DES";
private final static String cipher_init = "DES";
public static String encrypt(String data, String key) throws Exception {
byte[] bt = encrypt(data.getBytes(), key.getBytes());
String str = Base64.encodeBase64URLSafeString(bt);
return URLEncoder.encode( str, utf8 );
}
public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);
// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(cipher_init);
// 用密钥初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
return cipher.doFinal(data);
}
public static String decrypt(String data, String key) throws IOException, Exception {
if (StringUtils.isEmpty(data)) {
return null;
}
String str = URLDecoder.decode(data, utf8);
byte[] buf = Base64.decodeBase64(str);
byte[] bt = decrypt(buf, key.getBytes());
return new String(bt);
}
public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);
// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance(cipher_init);
// 用密钥初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
return cipher.doFinal(data);
}
}
从第三方系统登录O2OA
第三方系统使用数据加密登录O2OA
/**
* 从系统中获取已经登录第三方系统的用户账号,并且进行账号和信息加密,送到到O2OA进行登录
*/
//sso名称和密码是在O2OA平台中约定的配置项
String sso_client_name = "ERP";
String sso_key = "password";
//sso_url在O2OA平台中准备好的单点登录页面模板
//文件路径:o2server/servers/webserver/x_desktop/sso.html
String sso_url = "http://o2oa_hostip:port/x_desktop/sso.html";
//login_uid为在第三方系统中识别的登录账号名,这里理解为双方系统账号是统一的账号
String login_uid = "user1";
//获取当前时间
long time = new Date().getTime();
//将用户账号和登录时间一起使用sso_key进行信息加密
String xtoken = null;
try {
xtoken = Crypto.encrypt( login_uid + "#" + time, sso_key );
response.sendRedirect( sso_url + "?client=" + sso_client_name + "&xtoken=" + xtoken );
} catch (Exception e) {
e.printStackTrace();
}
信息加密后,将用户的登录账号(O2OA可以识别的账号)以及登录时间一起使用约定的密码进行加密,然后发送到O2OA的sso.html
O2OA相关修改(sso.html)
文件路径:o2server/servers/webServer/x_desktop/sso.html 修改登录相关的代码
COMMON.setContentPath("/x_desktop");
COMMON.AjaxModule.load("mwf", function(){
MWF.getJSON("res/config/config.json", function(config){
getServiceAddress(config, function(address){
var uri = new URI(window.location.toString());
var xtoken = uri.getData("xtoken");
var client = uri.getData("client");
if (xtoken){
var res = new Request.JSON({
url: address+"/jaxrs/sso",
secure: false,
method: "POST",
noCache: true,
withCredentials: true,
onSuccess: function(responseJSON, responseText){
window.location = "/index.html" ;
}.bind(this),
onFailure: function(xhr){
window.location = "/index.html";
}.bind(this),
onError: function(text, error){
window.location = "/index.html";
}.bind(this)
});
res.setHeader("Content-Type", "application/json; charset=utf-8");
var json = {"token": xtoken, "client": client};
res.send(JSON.encode(json));
}else{
window.location = "/index.html";
}
});
});
系统登录成功,可以指定到单独的门户页面,或者打开指定应用界面。登录失败后,也可以指定到单独的错误处理页面。
Java加密获取token方式
String login_uid = "test";
long time = new Date().getTime();
String sso_key = "12345678";
String xtoken = Crypto.encrypt( login_uid + "#" + time, sso_key );
JS脚本打开URL脚本如下
var client = "unicom";
var xtoken = "5no3eDzdxrU1-cV_7F7e1gZq-RKMrJ-X" ;
var redirect= "http://127.0.0.1/x_desktop/app.html?app=process.TaskCenter" ;
var url = "http://127.0.0.1/x_desktop/sso.html" + "?client=" + client + "&xtoken=" + xtoken + "&redirect=" + redirect ;
window.open(url);
推荐文章:
服务集成-通过接口实现表单上传附件功能
2021-03-15
O2OA允许用户使用接口来完成对流程、表单以及数据的相关操作。本文介绍如何使用接口来实现表单上传附件的功能。这样便能将流程附件的管理与其他业务进行整合,更方便业
服务管理-开发代理程序
2021-03-01
O2OA提供的服务管理中心可以让用户使用Javascript语言自由编写脚本的处理逻辑来实现与第三方的数据交互,数据同步以及系统内的数据处理等工作,也可以编写系
开发知识-人大金仓数据安装
2021-02-07
一、安装程序 1、在安装前要创建一个帐号,不能用root帐号安装。 2、安装执行./setup.sh -iconsole 3、接受“此许可协议条款”,
源码调试-后端Java代码的远程调试
2021-03-15
O2OA是真正全代码开源的应用开发平台,开发者可以直接使用从github或者gitee上clone的源码编译成安卓客户端,代码可以修改,安全可靠,无限制。O2O
个人通讯录使用手册
2021-02-19
O2OA个人通讯录提供二部分个人信息展现和查询,并且提供人员信息二维码,可以用手机扫码后直接导入手机通讯录,支持批量导出人员信息vcf文件。
源码编译-IOS客户端打包处理
2021-03-15
O2OA是真正全代码开源的应用开发平台,开发者可以直接使用从github或者gitee上clone的源码编译成IOS客户端,代码可以修改,安全可靠,无限制。本文
系统安全-自签名SSL证书验证HTTPS功能
2021-02-25
为增加系统和用户的安全性,平台支持启用HTTPS,使用SSL对网络流量进行证书加密传输。本篇主要介绍如何将在O2OA中使用自签名SSL证书验证HTTPS功能。
平台服务器版本升级操作说明
2021-02-25
O2OA信息化系统开发平台提供离线升级命令,用户可以下载最新的安装包到服务器进行服务器升级,系统升级时可以对旧程序进行备份,让升级操作更加可靠。
前端API-前端界面开发API文档
2021-03-02
O2OA使用前后端分离的模式进行系统设计,并且也开放了全部的后端API供开发者使用,开发者可以根据各类API组织出符合实际业务需求的新服务或者新业务。本文主要介
自定义服务-搭建自定义工程及开发
2021-03-01
O2OA提供让开发者修改或者编写后台Java代码来提供额外的数据或者业务逻辑服务的模式,有效地保证了系统的整体业务适应能力和服务的灵活性。本文主要介绍O2OA系