免登功能 - 使用Java代码生成简单认证参数例子篇原创
金蝶云社区-yaojunsong
yaojunsong
7人赞赏了该文章 3,653次浏览 未经作者许可,禁止转载编辑于2020年01月15日 11:24:27
summary-icon摘要由AI智能服务提供

本文提供了Java代码示例,用于实现免登功能,通过组合数据中心ID、用户名、应用ID、应用秘钥和当前时间戳等参数,并对其进行排序、拼接、SHA加密生成签名,最终组装成URL参数或JSON字符串,实现免登访问金蝶云星空系统。文章还包含了对导入Base64库的疑问解答,并提供了相关参考文档链接,以便进一步了解免登功能和相关技术实现。

免登功能 - 使用Java代码生成简单认证参数例子篇


老多同学都在纠结Java生成问题,现把免登功能的java代码独立成篇,方便阅读和查找。


import java.io.UnsupportedEncodingException;

import java.util.Arrays;

//这个不要引用,否则编码会错误

//import org.apache.commons.codec.binary.Base64;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

import org.apache.commons.codec.digest.DigestUtils;


public class HellWorld {

        public static void main(String[] args) throws UnsupportedEncodingException

        {

            String dbId = "xxxx"; //数据中心ID

            String usserName = "DEMO"; //用户名称

            String appId = "OA"; //第三方系统应用Id

            String appSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; //第三方系统应用秘钥


            long currentTime=System.currentTimeMillis()/1000; // 当前时间(秒)

            String timestamp=Long.toString(currentTime);

            

            String[] strArray ={dbId, usserName, appId, appSecret,timestamp};

            Output("Before Sigend",strArray);

            //签名字符串数组需要排序,后生成签名

            Arrays.sort(strArray); 

            Output("After Sigend",strArray);

            

            String combStr=null;

            for(int i=0;i<strArray.length;i++) {

                    if(combStr==null || combStr==""){

                            combStr = strArray[i];

                    }else{

                            combStr= combStr+strArray[i];

                    }

            }

           

            byte[] strByte = combStr.getBytes("UTF-8");

            Output("utf8 bytes",strByte);

            

            byte[] strSign = DigestUtils.sha(strByte);

            String sign = bytesToHexString(strSign);

            Output("signedData",sign);

            

            //V1版本参数格式(https://vip.kingdee.com/article/8927

            //String urlPara = String.format("|%s|%s|%s|%s|%s|%s", dbId, usserName, appId, sign, timestamp, "2052");


            //V2版本参数格式(https://vip.kingdee.com/article/8928

            // * json表达式不要存在空格,避免url编码后变成+号引起登入错误 *

            String urlPara = String.format(

                "{dbid:'%s',username:'%s',appid:'%s',signeddata:'%s',timestamp:'%s',lcid:'%s',origintype:'simpas'}",

                dbId, usserName, appId, sign, timestamp, "2052");


             Output("urlPara",urlPara");


            // 金蝶云星空入口链接 urlEncode

            Output("urlEncode","https://v7demo.kingdee.com/k3cloud/html5/Index.aspx?ud="

                            + java.net.URLEncoder.encode(urlPara, "utf-8"));


            // 金蝶云星空入口链接 Base64

            //import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

            Output("base64","https://v7demo.kingdee.com/k3cloud/html5/Index.aspx?ud="

                            + Base64.encode(urlPara.getBytes("UTF-8")));

            

            // 默认浏览器打开url

            /*

            try{

                //创建一个URI实例,注意不是URL

                java.net.URI uri=java.net.URI.create(url);

                //获取当前系统桌面扩展

                java.awt.Desktop dp=java.awt.Desktop.getDesktop();

                //判断系统桌面是否支持要执行的功能

                if(dp.isSupported(java.awt.Desktop.Action.BROWSE)){

                    //获取系统默认浏览器打开链接

                    dp.browse(uri);

                }

            }catch(java.lang.NullPointerException e){

                //此为uri为空时抛出异常

            }catch(java.io.IOException e){

                //此为无法获取系统默认浏览器

            }*/

            }



        public static String bytesToHexString(byte[] src) {

                StringBuilder stringBuilder = new StringBuilder();

                if (src == null || src.length <= 0) {

                        return null;

                }

                for (int i = 0; i < src.length; i++) {

                        int v = src[i] & 0xFF;

                        String hv = Integer.toHexString(v);

                        if (hv.length() < 2) {

                                stringBuilder.append(0);

                        }

                        stringBuilder.append(hv);

                }

                return stringBuilder.toString();

        }


        public static void Output(String title, byte[] ar) {

                StringBuilder sb = new StringBuilder();

                for (int i = 0; i < ar.length; i++) {

                        sb.append(ar[i] + ",");

                }

                Output(title, sb.toString());

        }


        public static void Output(String title, String[] ar) {

                StringBuilder sb = new StringBuilder();

                for (int i = 0; i < ar.length; i++) {

                        sb.append(ar[i] + "|");

                }

                Output(title, sb.toString());

        }


        public static void Output(String title, String msg) {

                System.out.println(title + ":\t\t\t\t" + msg);

        }



------------------ Java答疑区 ----------------------

【疑问1】:import com.sun.org.apache.xerces.internal.impl.dv.util.Base64 没有找到,怎么办?

【答】:组件不是JDK标准库,JDK中默认包含了,是可以直接使用的。在eclipse中的解决方法步骤:

点击项目右击鼠标->Properties ->Java Bulid Path->Libraries ->JRESystem Library->Access rules ->双击->Type Access Rules,弹出界面后,在Accessible中点add按钮,弹出界面选accessible,下面填上**点击确定,就解决了。



------------------ 参考帖子区 ----------------------

姐妹篇

如果使用云星空默认免登逻辑登陆,可以参考下面文档实现外部参数生成即可


【第三方系统单点登录到金蝶云指南V2】 

https://vip.kingdee.com/article/9788 


利用启动插件校验机制实现免登录功能,实现跨系统无缝集成

https://vip.kingdee.com/article/8926 


【启动插件校验机制实现免登录功能,【简单通行证】方式】

https://vip.kingdee.com/article/8927


启动插件校验机制实现免登录功能-支持云之家集成与JSON参数

https://vip.kingdee.com/article/8928


自动登录后,实现自动打开某个单据的功能
https://vip.kingdee.com/article/10881 


免登后,二开如何控制注销后的index.aspx页面自动转向统一认证页面

https://vip.kingdee.com/article/170637 


... ...


图标赞 7
7人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!