...
代码块 | ||
---|---|---|
| ||
public class SmartbiToken { public static void main(String[] args) throws Exception { // 1、准备加密参数 String secretKey = "12345678";// 密钥 long timestamp = new java.util.Date().getTime();// 必需是毫秒数的时间戳 String userName = "admin"; // 用户名,可基于业务动态获取 String password = "admin"; // 用户密码(可选),可基于业务动态获取 // 准备加密的JSON串,用户密码可选 String loginInfo= "{\"username\":\"" + userName + "\",\"password\":\"" + password + "\",\"timestamp\":" + timestamp + "}"; // 2、进行加密 String token = CryptoUtil.encrypt(AlgorithmType.DES, loginInfo, secretKey); // 3、链接转码 String encodedToken = java.net.URLEncoder.encode(token, "UTF-8"); // 4、拼接登录链接 String url = "http://localhost:8080/smartbi/vision/loginByToken?smartbiToken=" + encodedToken; // 6、拼接登录后的跳转请求5、拼接登录后的跳转请求 String targetPath = "openresource.jsp?resid=I2c94ea86298cbe6c01298cfd9ba900fa"; targetPath = java.net.URLEncoder.encode(targetPath, "UTF-8"); String endUrl = url + "&targetPath=" + targetPath; System.out.println(endUrl); } } |
...
加密部分主要有主要有两种算法DES加密和AES-GCM加密
- DES加密:CryptoUtil.encrypt(AlgorithmType.DES, loginInfo, 密钥)。
- AES-GCM加密:smartbi.crypto.CryptoUtil.encrypt(loginInfo, 密钥) 或 CryptoUtil.encrypt(AlgorithmType.AES_GCM, loginInfo, secretKey)
注意秘钥长度,如果秘钥不是8个字符的,使用AES-GCM加密加密会报错如下:The key length must be 16 bytes
(3)链接转码
拿到令牌之后需要对令牌进行url转码,如果是Java系统可以使用 java.net.URLEncoder.encode(token, "UTF-8")进行转码,js代码则可以使用encodeURIComponent函数来进行转码。如果说不转码的情况下,同样会出现问题1“解析令牌失败”的问题。
(4)拼接登录链接
拼接的单点地址需要使用loginByToken,然后smartbiToken参数用来指定token:"http://localhost:8080/smartbi/vision/loginByToken?smartbiToken=" + encodedToken;
(5)拼接登录后的跳转请求
登录完成之后,需要使用targetPath参数来指定跳转之后需要拼接的地址,这个地址在拼接到最终请求之前同样需要进行url转码,否则在openresource的请求里,当设置集成报表的参数时,会将集成的参数当成是loginByTokenq请求的参数,导致openresource请求传参失败,具体可以参考如下图中的请求参数信息。