...
如果在系统选项中设置了自定义的异常提示,前台的提示信息就不是很明显,此时可以打开系统监控然后监控日志,就能看到如下日志,可确认是上述问题中的那一个
在使用令牌token的时候要如何避免这些问题,在生成和使用令牌的时候又要注意哪些问题呢?下面我们就用一个代码示例来确认来讲解:
代码块 | ||
---|---|---|
| ||
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、拼接登录后的跳转请求
String targetPath = "openresource.jsp?resid=I2c94ea86298cbe6c01298cfd9ba900fa";
targetPath = java.net.URLEncoder.encode(targetPath, "UTF-8");
String endUrl = url + "&targetPath=" + targetPath;
System.out.println(endUrl);
}
} |
(1)加密参数部分
加密参数主要由四部分组成
- 秘钥:设置的秘钥要与Smartbi的config界面配置的秘钥一致,不一致则可能会出现问题1“解析令牌失败”的问题。另外令牌一般设置8个字符,否则AES算法时会加密异常。
- 时间戳:时间戳需要获取当前时间,确保第三方系统时间和Smartbi服务器的时间差距不大,否则可能会出现问题2“令牌超时”的问题。
- 用户名:用户名需要传入Smartbi上用户的用户名,同时确保Smartbi上存在对应用户,否则会出现问题2“用户不存在”的问题,需要做好用户同步
- 密码:密码是可选传入,若config上配置了需要传入密码,则一定需要传入。
(2)进行加密
加密部分主要有主要有两种算法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