mirror of
https://e.coding.net/mcontext/mContext/sdu_server.git
synced 2024-09-18 02:24:54 +08:00
uCloud授权接口
This commit is contained in:
parent
1b2027b9d0
commit
0dde7ca167
@ -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);
|
||||
}
|
||||
}
|
62
src/main/java/com/yuxihan/ucloud/auth/bean/AuthRequest.java
Normal file
62
src/main/java/com/yuxihan/ucloud/auth/bean/AuthRequest.java
Normal 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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
108
src/main/java/com/yuxihan/ucloud/auth/util/Encryptor.java
Normal file
108
src/main/java/com/yuxihan/ucloud/auth/util/Encryptor.java
Normal 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();
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user