uCloud授权接口

This commit is contained in:
BA7LZD 2020-06-16 02:02:03 +08:00
parent 1b2027b9d0
commit 0dde7ca167
6 changed files with 392 additions and 0 deletions

View File

@ -0,0 +1,50 @@
package com.yuxihan.ucloud.auth.bean;
import com.google.gson.Gson;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* @description:
* @author: joshua
* @E-mail: joshua.yin@ucloud.cn
* @date: 2018-11-29 15:15
*/
public class AuthPrivateUrlRequest {
@NotEmpty(message = "method is required!")
private String method;
@NotEmpty(message = "bucket is required!")
private String bucket;
@NotEmpty(message = "key is required!")
private String key;
@NotNull(message = "expires is required!")
private Long expires;
private String optional;
public String getMethod() {
return method;
}
public String getBucket() {
return bucket;
}
public String getKey() {
return key;
}
public long getExpires() {
return expires.longValue();
}
public String getOptional() {
return optional;
}
@Override
public String toString() {
return new Gson().toJson(this);
}
}

View File

@ -0,0 +1,62 @@
package com.yuxihan.ucloud.auth.bean;
import com.google.gson.Gson;
import org.hibernate.validator.constraints.NotEmpty;
/**
* @description:
* @author: joshua
* @E-mail: joshua.yin@ucloud.cn
* @date: 2018-11-29 15:15
*/
public class AuthRequest {
@NotEmpty(message = "method is required!")
private String method;
@NotEmpty(message = "bucket is required!")
private String bucket;
private String key = "";
private String content_type = "";
private String content_md5 = "";
private String date = "";
private String optional;
private String put_policy;
public String getMethod() {
return method;
}
public String getBucket() {
return bucket;
}
public String getKey() {
return key;
}
public String getContent_type() {
return content_type;
}
public String getContent_md5() {
return content_md5;
}
public String getDate() {
return date;
}
public String getOptional() {
return optional;
}
public String getPut_policy() {
return put_policy;
}
@Override
public String toString() {
return new Gson().toJson(this);
}
}

View File

@ -0,0 +1,49 @@
package com.yuxihan.ucloud.auth.controller;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.yuxihan.ucloud.auth.bean.AuthPrivateUrlRequest;
import com.yuxihan.ucloud.auth.bean.AuthRequest;
import com.yuxihan.ucloud.auth.service.UfileAuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @description:
* @author: joshua
* @E-mail: joshua.yin@ucloud.cn
* @date: 2018-11-29 10:37
*/
@Controller("authController")
public class AuthController {
@Autowired
private UfileAuthService ufileAuthService;
@RequestMapping(value = "/applyAuth", method = RequestMethod.POST)
@ResponseBody
public String applyAuth(@RequestBody AuthRequest requestBean) {
System.out.println("applyAuth--->\n" + requestBean.toString());
JsonElement jsonElement = new Gson().fromJson(requestBean.getOptional(), JsonElement.class);
// 您可以根据您的项目需求处理端传来的Optional参数集合
if (jsonElement != null)
System.out.println(jsonElement.toString());
return ufileAuthService.calculateAuthroization(requestBean);
}
@RequestMapping(value = "/applyPrivateUrlAuth", method = RequestMethod.POST)
@ResponseBody
public String applyPrivateUrlAuth(@RequestBody AuthPrivateUrlRequest requestBean) {
System.out.println("applyPrivateUrlAuth--->\n" + requestBean.toString());
JsonElement jsonElement = new Gson().fromJson(requestBean.getOptional(), JsonElement.class);
// 您可以根据您的项目需求处理端传来的Optional参数集合
if (jsonElement != null)
System.out.println(jsonElement.toString());
return ufileAuthService.calculatePrivateUrlAuthroization(requestBean);
}
}

View File

@ -0,0 +1,92 @@
package com.yuxihan.ucloud.auth.service;
import com.yuxihan.ucloud.auth.bean.AuthPrivateUrlRequest;
import com.yuxihan.ucloud.auth.bean.AuthRequest;
import com.yuxihan.ucloud.auth.util.Encryptor;
import com.yuxihan.ucloud.auth.util.ParameterValidator;
import org.springframework.stereotype.Service;
import sun.security.validator.ValidatorException;
import java.util.Base64;
/**
* @description:
* @author: joshua
* @E-mail: joshua.yin@ucloud.cn
* @date: 2018-11-29 14:20
*/
@Service
public class UfileAuthService {
private static final String publicKey = "TOKEN_fba51889-6f2f-40d4-80dc-59a43a2e3b1c";
private static final String privateKey = "5cc9c018-41ef-4d34-9707-b8009ba7f837";
public String calculateAuthroization(AuthRequest request) {
try {
ParameterValidator.validator(request);
StringBuffer signData = new StringBuffer();
signData.append(request.getMethod() + "\n");
signData.append(request.getContent_md5() + "\n");
signData.append(request.getContent_type() + "\n");
signData.append(request.getDate() + "\n");
signData.append("/" + request.getBucket());
signData.append("/" + request.getKey());
if (request.getPut_policy() != null && !request.getPut_policy().isEmpty()) {
signData.append(request.getPut_policy());
}
String signature = signature(privateKey, signData.toString());
StringBuilder res = new StringBuilder("UCloud ")
.append(publicKey)
.append(":")
.append(signature);
if (request.getPut_policy() != null && !request.getPut_policy().isEmpty()) {
res.append(":").append(request.getPut_policy());
}
return res.toString();
} catch (
ValidatorException e) {
return e.getMessage();
} catch (
Exception e) {
return e.getMessage();
}
}
public String calculatePrivateUrlAuthroization(AuthPrivateUrlRequest request) {
try {
ParameterValidator.validator(request);
StringBuffer signData = new StringBuffer();
signData.append(request.getMethod() + "\n");
signData.append("\n");
signData.append("\n");
signData.append(request.getExpires() + "\n");
signData.append("/" + request.getBucket());
signData.append("/" + request.getKey());
return signature(privateKey, signData.toString());
} catch (ValidatorException e) {
return e.getMessage();
} catch (Exception e) {
return e.getMessage();
}
}
private String signature(String key, String data) throws Exception {
byte[] hmacSha1 = null;
hmacSha1 = Encryptor.Hmac_SHA1(key, data);
if (hmacSha1 == null || hmacSha1.length == 0)
throw new Exception("Encrypt Hmac-SHA1 failed!");
return Base64.getEncoder().encodeToString(hmacSha1);
}
}

View File

@ -0,0 +1,108 @@
package com.yuxihan.ucloud.auth.util;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @description:
* @author: joshua
* @E-mail: joshua.yin@ucloud.cn
* @date: 2018/11/8 10:57
*/
public class Encryptor {
public final static String TYPE_HMAC_SHA1 = "HmacSHA1";
public final static String TYPE_SHA1 = "SHA1";
/**
* Hmac-SHA1 加密
*
* @param key 加密秘钥
* @param data 加密内容
* @return 加密结果
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
* @throws IllegalStateException
*/
public static byte[] Hmac_SHA1(byte[] key, byte[] data) throws NoSuchAlgorithmException, InvalidKeyException, IllegalStateException {
if (key == null || key.length == 0)
return null;
if (data == null || data.length == 0)
return null;
byte[] result = null;
SecretKey secret = new SecretKeySpec(key, TYPE_HMAC_SHA1);
Mac mac = Mac.getInstance(TYPE_HMAC_SHA1);
mac.init(secret);
result = mac.doFinal(data);
return result;
}
/**
* Hmac-SHA1 加密
*
* @param key 加密秘钥
* @param data 加密内容
* @return 加密结果
* @throws UnsupportedEncodingException
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
* @throws IllegalStateException
*/
public static byte[] Hmac_SHA1(String key, String data) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, IllegalStateException {
if (key == null || key.length() == 0)
return null;
if (data == null || data.length() == 0)
return null;
return Hmac_SHA1(key.getBytes("UTF-8"), data.getBytes("UTF-8"));
}
/**
* SHA1 加密
*
* @param data 加密内容
* @return 加密结果
* @throws NoSuchAlgorithmException
*/
public static byte[] SHA1(byte[] data) throws NoSuchAlgorithmException {
if (data == null || data.length == 0)
return null;
MessageDigest digest = MessageDigest.getInstance(TYPE_SHA1);
return digest.digest(data);
}
public static byte[] SHA1(File file) throws NoSuchAlgorithmException, IOException {
if (!file.exists() || !file.isFile())
return null;
FileInputStream fis = null;
return SHA1(new FileInputStream(file));
}
public static byte[] SHA1(InputStream inputStream) throws NoSuchAlgorithmException, IOException {
if (inputStream == null)
return null;
MessageDigest sha1 = MessageDigest.getInstance(TYPE_SHA1);
try {
byte[] buff = new byte[64 * 1024];
int len = 0;
while ((len = inputStream.read(buff)) > 0)
sha1.update(buff, 0, len);
} finally {
if (inputStream != null)
inputStream.close();
}
return sha1.digest();
}
}

View File

@ -0,0 +1,31 @@
package com.yuxihan.ucloud.auth.util;
import sun.security.validator.ValidatorException;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Iterator;
import java.util.Set;
/**
* @description:
* @author: joshua
* @E-mail: joshua.yin@ucloud.cn
* @date: 2018-11-29 15:07
*/
public class ParameterValidator {
/**
* 校验器工厂
*/
private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
public static <T> void validator(T obj) throws ValidatorException {
Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);
Iterator<ConstraintViolation<T>> it = constraintViolations.iterator();
while (it.hasNext())
throw new ValidatorException(it.next().getMessage());
}
}