第三方系统单点登陆NC Cloud
1 第三方单点登录NC Cloud概览
第三方单点登录的流程:
详细流程图见下图:
2 第三方系统单点登录NC Cloud详细流程
2.1 在NC Cloud的系统注册表sm_oauth_security注册第三方系统
表中各字段含义如下:
- CLIENT_ID :第三方系统编码,必需项
- CLIENT_NAME: 第三方系统名称,非必需
- CLIENT_SECURITY: 第三方系统和NC Cloud共同维护的秘钥对
- PK_OAUTH_SECURITY: 主键,
- CLIENT_URL: 第三方系统的url (供NC Cloud集成访问第三方系统使用,本环节不需要)
- CLIENT_AUTHCLASS: 登录第三方系统授权类 (供NC Cloud集成访问第三方系统使用,本环节不需要)
- PK_GROUP:非本环节使用,设置为空
2.2 获取登录token
通过秘钥对获取登录token,第三方服务访问 同时访问参数为:
- ype 获取方式,此方式为固定为 type_security且必需项
- dsname 数据源名称,必需项
- usercode NC Cloud用户编码,必需项
- langcode 多语语种,非必需项,为空默认中文语种
- busicentercode 账套编码,非必需项,为空登录时会循环在数据源中查找用户
- ts ,第三方系统加签的时间,用来生成校验秘钥对,必需项
- client_id第三方系统id,即第一步在sm_oauth_security注册的系统编码,必需项
- security第三方由共同维护的秘钥对根据给定的算法自己生成的秘钥值,必需项。 security是通过SHA256加签,其中是根据usercode,ts,client_security和当前系统时间动态拼接的字符串生成
注:8中的client_security为第三方密钥,当第三方不需要该密钥时,与1.1.1第三方系统注册中CLIENT_SECURITY参数保持一致。
代码如下:
String CLIENTID = "NCCceshi";
String CLIENTSECURITY = "123qwe";
//系统编码
String appCode = "CA_SYS";
//当前待办需要打开的环境Url(即用友NC服务器)http://ip:port/
String signUrl = http://127.0.0.1:8009/;
//当前系统使用的账套
String accCode = "NCC";
//当前系统帐套编码关联的数据源
String ds = "desgin";
//用户编码
String userCode = "test"
//获取用户单点凭证
String nccToken = HttpRequestUtil.getNCCToken(signUrl, ds, userCode, CLIENTID, CLIENTSECURITY, accCode);
String redirectUrl = signUrl + "/nccloud/resources/uap/rbac/thirdpartylogin/main/index.html?accesstoken=" + nccToken + "&redirect_uri=" + signUrl + "/nccloud/resources/workbench/public/common/main/index.html#/";
// 跳转到主页桌面
resp.sendRedirect(redirectUrl);
token获取
public class HttpRequestUtil {
public static String getNCCToken(String url, String dsname, String usercode, String nccClient_id, String nccClient_secret, String accCode) throws Exception {
OutputStream os = null;
DataOutputStream dos = null;
InputStream is = null;
String returnFlag = "";
try {
URL preUrl = new URL(url + "/service/genThirdPartyAccessToken");
URLConnection uc = preUrl.openConnection();
uc.setDoOutput(true);
uc.setUseCaches(false);
uc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
uc.setRequestProperty("Content-Length", "10000" );
uc.setRequestProperty("userid", usercode);
HttpURLConnection hc = (HttpURLConnection) uc;
hc.setRequestMethod("POST");
StringBuffer sb = new StringBuffer();
String security = genKey(usercode,usercode + nccClient_secret + (System.currentTimeMillis() + "").substring(0, 6));
sb.append("type=type_security&dsname="+dsname+"&usercode="+usercode+"&client_id="+nccClient_id+"&security="+security+"&busicentercode="+accCode);
os = hc.getOutputStream();
dos = new DataOutputStream(os);
dos.writeBytes(sb.toString());
dos.flush();
is = hc.getInputStream();
int ch;
while ((ch = is.read()) != -1) {
returnFlag += String.valueOf((char) ch);
}
if(returnFlag == null || returnFlag.trim().length() == 0){
throw new BusinessException("获取NCC Token失败,请检查");
}
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if (dos != null) {
try {
dos.close();
} catch (Exception e2) {
}
}
if (os != null) {
try {
os.close();
} catch (Exception e2) {
}
}
if (is != null)
try {
is.close();
} catch (Exception e2) {
}
}
return returnFlag;
}
private static String genKey(String userid,String key) throws Exception{
return new Base().encodeToString(SignatureTookKit.digestSign(userid.getBytes(), key.getBytes()));
}
}
3 信任IP添加
在home\ierp\sf\nccssoConfig.xml中添加
<?xml version="1.0" encoding="UTF-8"?>
<NCCSSOConfigVO>
<authenticator id="default" classname="ncc.sso.bs.DefaultNCCSSOAuthenticator">
<regTimeOut>200</regTimeOut>
<listParam key="IPAddress">
<string>127.0.0.1</string>
</listParam>
</authenticator>
<authenticator id="type" classname="nc.sso.bs.AAA">
<regTimeOut>200</regTimeOut>
<listParam key="IPAddress">
<string>127.0.0.1</string>
</listParam>
</authenticator>
</NCCSSOConfigVO>
NCC2005产品本身单点登录有点问题,需要对应补丁包,否则可能会出现token获取成功,重定向后页面白板
有问题可以互相学习讨论