首页 教育

test

2020-02-27 10:06 wangshujun

 

中经社单点登录接口文档
V1.3.1
技术与数据中心
2018年10月
118
 
1Oauth2认证接口
1.1流程简述
、业务系统发现用户未登录状态,需要根据应用跳转接口的要求封装并进
行页面重定向
、重定向后单点登录系统会进行响应登录工作。并根据用户接受
行重定向,给业务系统发送等相应信息
、获取后,通过接口调用的方式获取
、获取后,通过接口调用的方式获取用户信息等信息。其
中用户信息是加密的,不同业务系统的秘钥是不同的,需要向管理员获取。
、需要登出的话需要通过 先调用单点登陆的,然后处理业务系统的登出
相关功能。(此登出会把整个单点登录状态的变为登出状态,其他的业务系统
也会受到影响)。
1.2前置条件
认证需要业务系统做相应的修改工作。
、此认证方式适合于基于协议的应用。
1.3应用登录跳转
用户访问业务系统时,业务系统需要拦截用户的登陆请求,并跳转到中经
社单点登录系统中,中经社单点登录系统会向用户展示相应的登录及其他操作
218
 
界面。
当业务系统拦截到登陆请求后,需要根据以下要求封装,然后进行页
面重定向到此上。
的访问地址: !" #$$$%&$%'$
封装参数说明:
参数名参数值说明
response_typecode固定值 ¢code¢
scoperead,write
固定值
¢read,write¢
client_idoauth1123
客户端在UIAS上注
册时的应用代
码,UIAS提供
redirect_uri
http%3A%2F%2Fapp.xhsceis.com%2F
oauthClient
%2Fauthorization_code_callback
客户端的回调函数,
客户端自定义
state
3e04e206-ad4c-4dff-a927-
d7fab1ad24f4
一个随机值, UIAS
将原样返回,用于检
测是否为跨站请求
ÕCSR×)等,客户端自
定义,32位UUID
gotoUrl
http%3A%2F%2Fapp.xhsceis.com
%3A8080%2Fcxbook%2Fsys
%2FroleMag.jsp
应用向多因子认证前
访问的URL
referer
http%3A%2F%2Fapp.xhsceis.com
%3A8080%2Fcxbook%2Fwelcome.jsp
认证发起时的url,
可用于判定认证来源
Õ可以不写)
p01
str1
扩展参数1
p02扩展参数2
p03扩展参数3
p04扩展参数4
p05扩展参数5
p06扩展参数6
p07扩展参数7
p08扩展参数8
p09扩展参数9
P10扩展参数10
示例:
 !" #$$$%&$%'$ (
)*+*,$+$$*+$$*
318
 
-%-.- !$ #-.'$
-.$"/+*001222032
454+&*-%-.-. !$ #-.!-.)
-.6& +3*+3*
1.4获取code接口
当业务系统完成了应用登录跳转的操作后,并跳转到单点登录系统。此时
单点登录系统会根据用户的状态进行一些列操作,包括登陆、如果是初始密码
则要强制修改密码等等。当着操作完成后,单点登录系统会进行回调业务系统,
也就是单点登录系统会进行页面重定向到业务系统的那个获取的回调
,并把信息已经之前传入的一些参数发送给这个回调
回调参数如下:
参数名参数值说明

用来获取access_tocken的code值
'
客户端在UIAS上注册时的应用代码
&
应用登录跳转传给单点登陆的
&参数,便于业务系统重定向
p01
应用登录跳转传给单点登陆的扩展
参数
p02
应用登录跳转传给单点登陆的扩展
参数
p03
应用登录跳转传给单点登陆的扩展
参数
p04
应用登录跳转传给单点登陆的扩展
参数
p05
应用登录跳转传给单点登陆的扩展
参数
p06
应用登录跳转传给单点登陆的扩展
参数
p07
应用登录跳转传给单点登陆的扩展
参数
p08
应用登录跳转传给单点登陆的扩展
参数
p09应用登录跳转传给单点登陆的扩展
418
 
参数
P10
应用登录跳转传给单点登陆的扩展
参数
具体回调重定向例如下:
 !$ #'$$"/(
*%789:;+'*+&*-%-.-. !$ #
-.!-.)-.6& +3*+3*
1.5获取token
当业务系统获取完 后,就可以根据这个 获取。此
接口不用进行重定向,接通过调用的方式可。具体接口说明如下:
、接口
如果业务系统部署在中经社机房内,则接口如下:
< 0 4 0303$
如果业务系统部署互联网环境下,则接口如下:
 !" #$
、请求参数
参数名参数值说明
grant_typeauthorization_code
授权类型,固定值
¢authorization_code¢
client_idOauth1123
客户端在UIAS上注册时
的应用代码,UIAS提供
client_secretOauth1123
客户端在UIAS上注册时
的应用代码,UIAS提供
code77unCQ
通过第二步UIAS获
取code参数值
redirect_uri
http%3A%2F%2Fapp.xhsceis.com
%2FoauthClient
%2Fauthorization_code_callbac
k
客户端的回调函数,客
户端自定义
内网请求示例
< 0 4 0303$(
518
 
 
 
$$*+$*+&)*$"/+
$$*-%-.-. !$ #-.'$
-.$"/+*<<'=
互联网请求示例
 !" #$(
$$*+$*+&)*$"/+
$$*-%-.-. !$ #-.'$
-.$"/+*<<'=
、返回果():
>???012232412
1140?,?)???,?!$$?00,???$?@
:用来获取用户信息的
)类型于业务系统无实际意
!$$
8:访问权限类型
1.6用户信息接口
用户信息接口要在应用系统获取 成功后,根据 获取单点登录
系统应用系统开放的基信息。
、接口
如果业务系统部署在中经社机房内,则接口如下:
< 0 4 0303$$)$5
如果业务系统部署互联网环境下,则接口如下:
 !" #$$)$5
、请求参数
参数名参数值说明
access_token
c14945e6-b4c5-40aa-8426-
63e6e8cd319b
AccessToken
618
 
 
 
 
内网请求示例
< 0 4 0303$$)$5(*012232
4121140
互联网请求示例
 !" #$$)$5(*012232
4121140
、返回果():
>???3333333?,?'??#?@
':应用代码
:接口返回的密文,密文需要通过单点登录系统发钥进行密。
1密过程说明(具体A代码详见附
43字符串对%8'BB码,解析到一个1字符串
使C1D&  ##  $) C1E码,
字符集F.24进制数)
根据'提取应的应用秘钥文文件(B%8G)# ),
文件,3字符串,将3串按照4%8'BB码的原
则,解析得1字符串对该字符串进行1码,字符
F.24进制数)钥),3 HG'8填充模
式。
使8%算法使))进行密,到原文的
进制数)
将数)字符集F.24,转为字符串该字符串即为接口返
回的原文
示例3转为%8'BB算法数据
3
33333333333333333333333333333333333333
%8'BB码:I*
示例1转为原文字符串算法数据
1
7;J#09;CBKC6LM".96NJ#F6MF#.3MH.CK=#$F.#J
7)46KKLO!.JF#6P=L"J=P"6N'JP=#9
字符串
'5N3K!Q93OMA5PL38:HH$OCAI=5G
718
 
 
 
<FO"B4MPC=.HCAM!1LICM
1
8%!9MJ.!6:6FOK.JOM#P7#HF;F:LJ:MPF3JF=QF"&POM;.M
=!6KJM;6:L'KMA;PMCJ".#3G8.!.9!%**
字符串
L37:&=Q3LP;.;QR=;B:6.PPF;41'CJ3A'3CC4!#H
70:"7&.IJB%QJ&)$Q;
1
M")LF37M:!M"P.NFO1M#P;MM.9LPNP9.!KJ8."#3=3;M
MAP=MM79K"BJPK6MJ;PJKC;M73Q9:*
字符串
98JLNF6$7QF$=9"M'#:7C&=QA!L%"'L'<N)%
4OOJ1#P58OM&0.OAH'MA7%
<解析后的用户信息(
>????,?'??$?,?#???,?P??3?,?&P#?
?技术与数据中
?,???01<0401<003?,?&$??"&?,?&B?
?3333333331?,?#???,?#$H??413333,3,3,3333PK
333333,443<?,?&?,?F)A???,?$B??41%4.:4C.
CC40.':11C:4?,?#$??"&S!$ &?,?&'??3333333331?,
?$F$##??000<1?,?B??55?,?#??
?,?'??"H?,?F)???,?#???@
参数名参数值说明
B55
用户id,一值
&$
zhangsan
用户登陆系统的登录名(用
于it系统的标识
#
张三姓
&B<3
ID
&P#
技术与数据中心机
&'<
代码
#$H
413333,3,3,3333
PK333333,443<
多个信息合,包括
,员工编号考勤编
,ncid,内部电话,中
由逗号分隔
818
 
#$"&S!$ &
邮箱
F)
用户登录系统使用的认证方
式ID。认证方式ID如
下:1密码,2证,3令牌,4
信,5二维码。
'"H
单点登录系统一代码
'"H
应用代码
$B
41%4.:4C.CC40.':
11C:4
单点用户在B%8上的
$B,此$用来登出系
P
B%8
1.7单点登出
重调用这个接口,会影响已经登陆的系统
单点登录应用通过$B进行单点登出。
、接口
 !" #$$T
、请求参数
参数名参数值说明
$B
41%4.:4C.CC40.':11
C:4
$B
、调用方式(
此调用只支持通过的方式调用。
$.ajax({
url:"https://auth.xhszjs.com/uias/uias/shotOff?
sessionId=186A8121FE8B2F2B52B89FC2E6436BE8&jsoncallback=?",
dataType: "jsonp",
type: 'get',
success: function(data) {
if (data) {
//登出成功,并继续操作
} else {
//登出失败
}
},
error:function(XMLHttpRequest,textStatus,errorThrown){
918
 
//登出失败
}
});
1.8试环境
议现在测试环境调后,再更置到生产环境,测试环境支持互
联网能通过黑楼A登入后进行调
试环境
<  < 10303
2Kaa送(用户及机
2.1卡夫卡参数
务地址:R !$ 030,R !$ 030,R !$ 030
F$$2#&
2.2通用
式:
参数名参数值说明
msgId
id
息的一id
msgType
类型
1、用户修改,2、用户
,3、机修改,4、机
删除,5、账号认证修改
msgContent
内容具体传入的参数,式是
1018
 
json
2.3用户信息修改
示例:
{"msgId"="01695779878d1c0089166b7888f46500","msgType”=1,
“msgContent”={"usercode":"xxx","username":"XXX","userstatus":"0","accountstatus":"0","
mobilephone":"18601020304","phonein":"88051111","email":"xxx@xinhua.org","ncid":"00
011A100000000047Z2","timecardid":"10111","stuffcode":"41230","orgCode":"31700_09"}
}
其中msgContent具体的用户信息。
{"usercode":"xxx","username":"XXX","userstatus":"0","accountstatus":"0","mobilephone":"
18601020304","phonein":"88051111","email":"xxx@xinhua.org","ncid":"00011A10000000
0047Z2","timecardid":"10111","stuffcode":"41230","orgCode":"31700_09"}
参数说明
参数名参数值说明
usercode
用户的
用户的登录账号全局唯
username
用户名用户的
userstatus
用户状态0:正常,1、异常
accountstatus
账号状态0:正常,1、异常
mobilephone
号手
emailemailemail
ncid
$
NC系统的员信息
timecardid
考勤$
考勤系统的一值
stuffcode
员工编号员工
orgCode
所属构所在机
2.4用户信息删除消
示例:
{"msgId"="01695779878d1c0089166b7888f46500","msgType”=2,“msgContent”={"userco
de":"xxx"}}
其中msgContent具体的用户信息。
{"usercode":"xxx"}
1118
 
参数说明
参数名参数值说明
usercode
用户的
用户的登录账号全局唯
2.5组织修改
示例:
{"msgId"="01695773beca1500b10ab70698d01ea0","msgType”=3,
“msgContent”={"orgName":"中经社控股有限公
","orgCode":"30103_01","parentCode":"30103"}}
其中msgContent具体的机信息。
{"orgName":"中经社控股有限公司","orgCode":"30103_01","parentCode":"30103"}
参数说明
参数名参数值说明
orgCode
构编
码,全局唯
orgName
的名
parentCode
构编
级该
2.6组织构删除
示例:
{"msgId"="01695773beca1500b10ab70698d01ea0","msgType”=3,
“msgContent”={"orgCode":"30103_01"}}
其中msgContent具体的机信息。
{"orgCode":"30103_01"}
参数说明
参数名参数值说明
orgCode
构编
码,全局唯
31(用户果信息编解码)
调用顺序见#$函数
import java.io.ByteArrayOutputStream;
1218
 
import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.crypto.AsymmetricBlockCipher;
import org.bouncycastle.crypto.encodings.PKCS1Encoding;
import org.bouncycastle.crypto.engines.RSAEngine;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.params.RSAKeyParameters;
import org.bouncycastle.crypto.util.PublicKeyFactory;
publicclass Decrypto {
private static final int MAX_DECRYPT_BLOCK = 128;
private static final String KEY_ALGORITHM = "RSA";
private static final String SIGNATURE_ALGORITHM = "MD5withRSA";
public static final String CHARSER = "UTF-8";
 
public static String appKey;
 
public static String parseUIAS(String cryptoText, String appCode, String
UIASFilePath, String decrypto) {
String result = "";
String pkey = "";
InputStream is = null;
try {
String fileName = UIASFilePath + "UIASKey_" + appCode + ".dat";
is = new FileInputStream(fileName);
byte[] b = newbyte[is.available()];
is.read(b);
is.close();
pkey = new String(b, "UTF-8");
pkey = b2s(pkey);
} catch (Exception e) {
e.printStackTrace();
} finally {
1318
 
if (is != null) {
is = null;
}
}
try {
if (!("".equals(pkey))) {
cryptoText = b2s(cryptoText);
byte[] data = decryptBASE64(cryptoText);
byte[] dedata = (byte[]) null;
if ("PKCS1".equals(decrypto))
dedata = decryptByPubKey2(data, pkey);
else {
dedata = decryptByPubKey(data, pkey);
}
if (dedata != null)
result = new String(dedata, "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
 
public static String initAppkey(InputStream appKeyIS) throws IOException{
byte[] b = new byte[appKeyIS.available()];
appKeyIS.read(b);
String keyStr = new String(b, "UTF-8");
keyStr = Decrypto.b2s(keyStr);
appKey = keyStr;
return keyStr;
}
 
public static String parseUIAS(String appKey,String cryptoText, String
decrypto) {
String result = "";
try {
if (!("".equals(appKey))) {
cryptoText = b2s(cryptoText);
byte[] data = decryptBASE64(cryptoText);
byte[] dedata = (byte[]) null;
if ("PKCS1".equals(decrypto))
dedata = decryptByPubKey2(data, appKey);
else {
1418
 
dedata = decryptByPubKey(data, appKey);
}
if (dedata != null)
result = new String(dedata, "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
 
public static boolean verifySign(byte [] data, String pKey, String sign) throws
Exception {
byte[] keyBytes = decryptBASE64(pKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey pubKey = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(pubKey);
signature.update(data);
return signature.verify(decryptBASE64(sign));
}
public static byte[] decryptByPubKey(byte[] data, String pkey) throws Exception
{
byte[] keyBytes = decryptBASE64(pkey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key pubKey = keyFactory.generatePublic(x509KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(2, pubKey);
return segmentCrypt(data, cipher, MAX_DECRYPT_BLOCK);
}
public static byte[] decryptByPubKey2(byte[] text, String pkey) throws
Exception {
byte[] data = (byte[]) null;
ByteArrayOutputStream bout = new ByteArrayOutputStream(MAX_DECRYPT_BLOCK);
try {
1518
 
byte[] keyBytes = decryptBASE64(pkey);
AsymmetricKeyParameter akp = PublicKeyFactory.createKey(keyBytes);
RSAKeyParameters rsaAKp = (RSAKeyParameters) akp;
BigInteger modulus = rsaAKp.getModulus();
BigInteger exponent = rsaAKp.getExponent();
RSAKeyParameters pubParameters = new RSAKeyParameters(false, modulus,
exponent);
AsymmetricBlockCipher eng = new RSAEngine();
eng = new PKCS1Encoding(eng);
eng.init(false, pubParameters);
int j = 0;
int l1 = text.length;
int l2 = j * MAX_DECRYPT_BLOCK;
int l3 = l1 - l2;
while (l3 > 0){
int aaa = (l3 > MAX_DECRYPT_BLOCK) ? MAX_DECRYPT_BLOCK : l3;
byte[] d1 = eng.processBlock(text, l2, aaa);
bout.write(d1);
++j;
l2 = j * MAX_DECRYPT_BLOCK;
l3 = l1 - l2;
}
data = bout.toByteArray();
} catch (Exception e) {
throw e;
}
return data;
}
private static byte [] segmentCrypt(byte[] data, Cipher cipher, int maxBlock) {
int inputLen = data.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] cache = (byte []) null;
byte[] result = (byte[]) null;
int offSet = 0;
int pos = inputLen;
int i = 0;
try {
while (pos> 0) {
if (pos > maxBlock) {
pos = maxBlock;
1618
 
}
cache = cipher.doFinal(data, offSet, pos);
out.write(cache, 0, cache.length);
++i;
offSet = i * maxBlock;
pos = inputLen - offSet;
}
result = out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
cache = (byte[]) null;
out = null;
}
return result;
}
public static byte[] decryptBASE64(String key) throws Exception {
return Base64.decodeBase64(key.getBytes("UTF-8"));
}
public static String b2s(String binStr) {
String[] tempStr = StrToStrArray(binStr);
char[] tempChar = newchar[tempStr.length];
for (int i = 0; i < tempStr.length; ++i) {
tempChar[i] = BinstrToChar(tempStr[i]);
}
return String.valueOf(tempChar);
}
private static String[] StrToStrArray(String str) {
int len = str.length()/ 8;
String[] arr = new String[len];
for (int i = 0; i < len; ++i) {
arr[i] = str.substring(8 * i, 8 * (i + 1));
}
return arr;
}
private static char BinstrToChar(String binStr) {
int[] temp = BinstrToIntArray(binStr);
int sum = 0;
1718
 
for (int i = 0; i < temp.length; ++i) {
sum += (temp[(temp.length - 1 - i)] << i);
}
return (char) sum;
}
private static int[] BinstrToIntArray(String binStr){
char[] temp = binStr.toCharArray();
int[] result = newint[temp.length];
for (int i = 0; i < temp.length; ++i) {
result[i] = (temp[i] - '0');
}
return result;
}
}
具体调用过程:
1先是初始密钥文件,把密钥文件取到内存中来,以便复利用。
logger.info("uisa key文件:");
String keyPath = "/path of key file";
File keyFile = new File(keyPath);
InputStream is = new FileInputStream(keyFile);
String keyStr = Decrypto.initAppkey(is);
is.close();
logger.info("完成uisa key文件的初始:"+keyStr);
2具体解密文件
String userJson = Decrypto.parseUIAS(Decrypto.appKey,result, "RSA");
result就是需要密的那个一10成的字符串
1818
 

 

责任编辑:wangshujun

返回首页
相关新闻
返回顶部