跳到主要内容

授权

通过 iframe 访问相关的开放组件,你需要先进行授权,授权成功后,才能访问到相关的开放组件。

授权流程

  1. 向特赞申请:authUrl, aesKey, aesIv,并根据实际的业务场景,咨询使用的租户域名,邮箱/手机等信息。
  2. SSO 认证链接格式:{authUrl}?aesUserInfo={encodeURIComponent(经过 aesKey 加密的用户信息)}&targetUrl={encodeURIComponent(认证成功重定向地址)}

加密算法:

  • AES. 数据填充方式: AES/CBC/PKCS5Padding

加密字段信息,举例如下:

{
"loginEmail": "test@demo.com",
"domain": "test.demo.com",
"encryptTime": "2024-04-17 19:38:32.430" // 当前时间,UTC格式
}

domain 为客户内容中台(DAM)的域名

sso url 中的参数需要进行 encodeURIComponent 处理

Example

加密信息示例代码如下:

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* AES加密工具
*/
public class AESUtilV2 {
private static final String KEY_ALGORITHM = "AES";
// CBC mode
private static final String ENCRYPT_MODE_CBC = "AES/CBC/PKCS5Padding";

/**
* AES 加密操作
*
* @param plainText 明文
* @param key 密钥
* @param iv 向量
* @return 返回Base64转码后的加密数据
*/
public static String encryptAndEncode(String plainText, String key, String iv) {
try {
byte[] bytePlainText = plainText.getBytes(StandardCharsets.UTF_8);
byte[] byteKey = key.getBytes(StandardCharsets.UTF_8);
byte[] byteIV = iv.getBytes(StandardCharsets.UTF_8);

Cipher cipher = Cipher.getInstance(ENCRYPT_MODE_CBC);// 创建密码器
IvParameterSpec ivParam = new IvParameterSpec(byteIV);
SecretKeySpec secretKey = new SecretKeySpec(byteKey, KEY_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParam);// 初始化为加密模式的密码器
byte[] result = cipher.doFinal(bytePlainText);// 加密
String encryptString = Base64.encodeBase64String(result);
return encryptString;
} catch (Exception ex) {
Logger.getLogger(AESUtilV2.class.getName()).log(Level.SEVERE, null, ex);
}

return null;
}

/**
* AES 解密操作
*
* @param ciphertext 密文
* @param key 密钥
* @param iv 向量
* @return 明文
*/
public static String decryptAndDecode(String ciphertext, String key, String iv) {
try {
ciphertext = URLDecoder.decode(ciphertext, StandardCharsets.UTF_8.name());
byte[] byteKey = key.getBytes(StandardCharsets.UTF_8);
byte[] byteIV = iv.getBytes(StandardCharsets.UTF_8);
Cipher cipher = Cipher.getInstance(ENCRYPT_MODE_CBC);
IvParameterSpec ivParam = new IvParameterSpec(byteIV);
SecretKeySpec secretKey = new SecretKeySpec(byteKey, KEY_ALGORITHM);
//使用密钥、向量进行初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParam);
//执行操作
byte[] result = cipher.doFinal(Base64.decodeBase64(ciphertext));
return new String(result, StandardCharsets.UTF_8);
} catch (Exception ex) {
Logger.getLogger(AESUtilV2.class.getName()).log(Level.SEVERE, null, ex);
}

return null;
}

public static void main(String[] args) {
JSONObject jo = new JSONObject();
// 用户邮箱和手机号,二者必选其一
jo.putIfAbsent("loginEmail", "wangfeng@tezign.com");
jo.putIfAbsent("loginPhone", "15705273217");
// 租户域名
jo.putIfAbsent("domain", "vms-t13.tezign.com");
// 加密时间,认证服务端会根据该时间戳进行失效校验
jo.putIfAbsent("encryptTime", new Date());
// 用户名,可选
jo.putIfAbsent("username", "levi.wang");

// 加密秘钥和偏移向量,由特赞对接人员提供
String aesKey = "1234567890abcdef";
String aesIv = "1234567890abcdef";

String ss = jo.toString();
String aa = encryptAndEncode(ss, aesKey, aesIv);
System.out.println("加密====== " + aa);

String bb = decryptAndDecode(aa, aesKey, aesIv);
System.out.println("解密====== " + bb);
}
}

验证

Input Encryption

aesKey:

aesIv:

Output Encryption