外系统单点登陆NCC或者单点登陆到用友BIP高级版的例子,提供专业的NC二次开发服务
1.NCC端处理内容
1.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:非本环节使用,设置为空
1.2设置白名单
在ncchome的路径:E:\yonyou\home\ierp\sf\ nccssoConfig.xml添加不拦截的配置
package ncc.chenhaifeng.qq767574478;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.*;
/**
* tel=17377029836
* @author chenhaifeng qq767574478
* 单点登陆到NCC NCC2111 BIP例子
*
*/
public class SsoNcc{
//第三方系统数据源 数据源的编码,本地开发为design 正式环境打开sysconfig查看
public static String dsname = "design";
//第三方id 注册时固定值
public static String client_id = "health";
//预订密钥
public static String client_security = "a49c24eeff6b1f6e0ab1a8fddc9ba5e27fbe2464c01d4ffa62db36f6d747f1db";
//开发环境默认develop账套 正式环境登陆root查看
public static String busicentercode = "develop";
//单点登陆到首页NCC 固定
public static String redirect_uri = "http://127.0.0.1:3006/nccloud";
//单点登录 获取token基本url 固定
public static String url = "http://127.0.0.1:9999/service/genThirdPartyAccessToken";
//通用地址 固定
public static String basic_url = "http://127.0.0.1:3007/nccloud/resources/uap/rbac/thirdpartylogin/main/index.html?";
/**
* 单点登录
*NC开发chenhaifeng qq767574478
* @param
* @return
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String usercode = "yonyou2";//用户的编码
//String url="http://127.0.0.1:9999/service/genThirdPartyAccessToken";
String security = genKey(usercode, usercode + client_security + (System.currentTimeMillis() + "").substring(0, 6));
String write = "type=type_security&dsname=" + dsname + "&usercode=" + usercode + "&client_id=" + client_id + "&security=" + security + "&busicentercode=" + busicentercode;
write = write.replaceAll("\\+", "%2B");//避免出现特殊符号问题。
//获取token
String token = getToken(url, write);
if ("".equals(token)) {
System.out.println("获取token失败");
}
//单点成功后的跳转路径,这里为首页工作桌面
// String redirect_uri = "http://127.0.0.1:3006/nccloud";
// String redirect_uri_ydd = "http://127.0.0.1:3006/nccloud/resources/workbench/public/common/main/index.html#/ifr?ifr=%252Fuapbd%252Fpsninfo%252Fpsndoc%252Fmain%252Findex.html&ifr=%252Fpu%252Fmedicalbook%252Fmedicalbookmasternew%252Fmain%252Findex.html&c=MeHdicalbook&p=MeHdicalbook_MedicalbookMasterNew&ar=1001ZZ1000000002C4UB&n=%25E4%25BD%2593%25E6%25A3%2580%25E9%25A2%2584%25E8%25AE%25A2%25E5%258D%2595&b1=%25E4%25BE%259B%25E5%25BA%2594%25E9%2593%25BE&b2=%25E9%2587%2587%25E8%25B4%25AD%25E7%25AE%25A1%25E7%2590%2586&b3=%25E9%2587%2587%25E8%25B4%25AD%25E5%2588%25B0%25E8%25B4%25A7";
//单点登陆时的全路径,可以直接粘贴到浏览器进行访问。
String fullUrl = basic_url +"accesstoken=" + token + "&redirect_uri=" + redirect_uri;
System.out.println("获取的token为:" + token);
System.out.println("单点登陆全路径,复制到浏览器地址栏即可:" + fullUrl);
}
/**
* 调用接口获取token
*
* @param url 要调用的接口
* @param write 需要写出的数据
* @return token值
* //NC专业开发服务,联系chenhaifeng qq767574478
*/
private static String getToken(String url, String write) {
OutputStream outStream = null;
DataOutputStream dataOutput = null;
InputStream inStream = null;
String ret = "";
try {
URL preUrl = new URL(url);
URLConnection con = preUrl.openConnection();
//设置为true,后面可以调用getOutputStream并传输数据 //NC专业开发服务,联系chenhaifeng qq767574478
con.setDoOutput(true);
//不使用http缓存
con.setUseCaches(false);
//设置http请求头
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setRequestProperty("Content-Length", "10000");
HttpURLConnection httpCon = (HttpURLConnection) con;
//这里使用post方式调用接口
httpCon.setRequestMethod("POST");
//获取输出流
outStream = httpCon.getOutputStream();
dataOutput = new DataOutputStream(outStream);
//接口需要的参数作为字节序列写入输出流
dataOutput.writeBytes(write);
dataOutput.flush();
//获取输入流
inStream = httpCon.getInputStream();
//读取服务返回的数据
int ch;
while ((ch = inStream.read()) != -1) {
ret += String.valueOf((char) ch);
}
} catch (Exception e) {
System.out.println(e);
} finally {
//关闭服务输入流和输出流 //NC专业开发服务,联系chenhaifeng qq767574478
if (dataOutput != null) {
try {
dataOutput.close();
} catch (Exception e2) {
}
}
if (outStream != null) {
try {
outStream.close();
} catch (Exception e2) {
}
}
if (inStream != null) {
try {
inStream.close();
} catch (Exception e2) {
}
}
}
//返回获取到的token
return ret;
}
private static String genKey(String userid, String key) throws Exception {
return new org.apache.commons.codec.binary.Base64().encodeToString(SignatureTookKit.digestSign(userid.getBytes(), key.getBytes()));
}
}