Files
xk-hy-transit-go/docs/FileAuth.java
2026-05-28 16:39:51 +08:00

154 lines
5.0 KiB
Java

/**
* bianque.com
* Copyright (C) 2013-2023 All Rights Reserved.
*/
package com.bqhealth.nethospital.supervise.common.utils;
import org.apache.commons.lang3.StringUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @author geyin
* @version FileAuth.java, v 0.1 2023-06-28 10:27
*/
public class FileAuth {
private static FileAuth instance;
private final SecretKeySpec secretKey;
private String accessKey;
public FileAuth(String accessKey, String secret) {
if (isNullOrEmpty(accessKey) || isNullOrEmpty(secret))
throw new IllegalArgumentException("empty key or secret");
byte[] sk = utf8Bytes(secret);
SecretKeySpec secretKeySpec = new SecretKeySpec(sk, "HmacSHA1");
this.accessKey = accessKey;
this.secretKey = secretKeySpec;
instance = this;
}
public static FileAuth instance() {
if (instance == null)
throw new IllegalStateException("FileAuth not setup,please check");
return instance;
}
private static String encodeToString(byte[] data) {
return Base64.encodeToString(data, 10);
}
public static byte[] decode(String data) {
return Base64.decode(data, 10);
}
private static boolean isNullOrEmpty(String s) {
return (s == null || "".equals(s));
}
private static byte[] utf8Bytes(String data) {
return data.getBytes(StandardCharsets.UTF_8);
}
public static void main(String[] args) {
FileAuth fileAuth = new FileAuth("accessKey", "secret");
String uptk = fileAuth.createUploadToken("other-doc");
System.out.println(uptk);
String token = fileAuth.createToken("5dbf93147826c67027c438bf", 3600L);
System.out.println(token);
System.out.println(fileAuth.createTokens("a,b,c", 3600L));
System.out.println(fileAuth.createTokensByListStr("[\"a\",\"b\"]", 3600L));
System.out.println(fileAuth.createTokensByListStr("[1,2]", 3600L));
}
public String getAccessKey() {
return this.accessKey;
}
private Mac createMac() {
Mac mac;
try {
mac = Mac.getInstance("HmacSHA1");
mac.init(this.secretKey);
} catch (GeneralSecurityException e) {
e.printStackTrace();
throw new IllegalArgumentException(e);
}
return mac;
}
public String sign(byte[] data) {
Mac mac = createMac();
return encodeToString(mac.doFinal(data));
}
public String sign(String data) {
return sign(utf8Bytes(data));
}
private boolean isTimeExpired(long expireTime) {
long nowTime = System.currentTimeMillis() / 1000L;
return (nowTime > expireTime);
}
public String createToken(String fileId, long expires) {
if (instance == null)
return null;
long deadline = System.currentTimeMillis() / 1000L + expires;
String sign = sign(fileId + "?" + deadline);
return StringUtils.join(new Object[] { Long.valueOf(deadline), this.accessKey, sign }, ":");
}
private String createTokens(String fileIds, long expires) {
String[] keys = StringUtils.split(fileIds, ',');
String[] tokens = new String[keys.length];
for (int i = 0; i < keys.length; i++)
tokens[i] = createToken(keys[i], expires);
return StringUtils.join((Object[])tokens, ",");
}
private String createTokensByListStr(String fileIdListStr, long expires) {
List<Object> fileIdList = JSONUtils.<List<Object>>parse(fileIdListStr, (Class)List.class);
List<String> strList = new ArrayList<>();
for (Object o : fileIdList)
strList.add(String.valueOf(o));
return JSONUtils.toString(createTokens(strList, expires));
}
private List<String> createTokens(List<String> fileIdList, long expires) {
List<String> list = new ArrayList<>();
for (String s : fileIdList)
list.add(createToken(s, expires));
return list;
}
public String createUploadToken(String bucket) {
Map<String, Object> policy = new HashMap<>();
policy.put("scope", bucket);
policy.put("deadline", Long.valueOf(System.currentTimeMillis() / 1000L + 3600L));
return createUploadToken(bucket, policy);
}
public String createUploadToken(String bucket, long expires) {
Map<String, Object> policy = new HashMap<>();
policy.put("scope", bucket);
policy.put("deadline", Long.valueOf(System.currentTimeMillis() / 1000L + expires));
return createUploadToken(bucket, policy);
}
public String createUploadToken(String bucket, Map<String, Object> policy) {
String sign = sign(JSONUtils.toString(policy));
return this.accessKey + ':' + sign + ':' + encodeToString(utf8Bytes(JSONUtils.toString(policy)));
}
}