|
|
@@ -32,105 +32,112 @@ import java.security.spec.X509EncodedKeySpec;
|
|
|
import java.util.*;
|
|
|
|
|
|
/**
|
|
|
- *
|
|
|
* 鉴权工厂类
|
|
|
* Created by wuxw on 2018/4/23.
|
|
|
*/
|
|
|
public class AuthenticationFactory {
|
|
|
|
|
|
- private final static String PASSWD_SALT= "hc@java110";
|
|
|
+ private final static String PASSWD_SALT = "hc@java110";
|
|
|
+
|
|
|
/**
|
|
|
* 用户密码 md5签名
|
|
|
+ *
|
|
|
* @param inStr
|
|
|
* @return
|
|
|
*/
|
|
|
- public static String passwdMd5(String inStr) throws NoAuthorityException{
|
|
|
- return md5(md5(inStr+PASSWD_SALT));
|
|
|
+ public static String passwdMd5(String inStr) throws NoAuthorityException {
|
|
|
+ return md5(md5(inStr + PASSWD_SALT));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* md5签名
|
|
|
+ *
|
|
|
* @param inStr
|
|
|
* @return
|
|
|
*/
|
|
|
- public static String md5(String inStr) throws NoAuthorityException{
|
|
|
+ public static String md5(String inStr) throws NoAuthorityException {
|
|
|
try {
|
|
|
return DigestUtils.md5Hex(inStr.getBytes("UTF-8"));
|
|
|
} catch (UnsupportedEncodingException e) {
|
|
|
- throw new NoAuthorityException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR,"MD5签名过程中出现错误");
|
|
|
+ throw new NoAuthorityException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR, "MD5签名过程中出现错误");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* dataFlow 对象签名
|
|
|
+ *
|
|
|
* @param dataFlow
|
|
|
* @return
|
|
|
*/
|
|
|
- public static String dataFlowMd5(DataFlow dataFlow) throws NoAuthorityException{
|
|
|
- if(dataFlow == null){
|
|
|
- throw new NoAuthorityException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR,"MD5签名过程中出现错误");
|
|
|
+ public static String dataFlowMd5(DataFlow dataFlow) throws NoAuthorityException {
|
|
|
+ if (dataFlow == null) {
|
|
|
+ throw new NoAuthorityException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR, "MD5签名过程中出现错误");
|
|
|
}
|
|
|
- String reqInfo = dataFlow.getTransactionId() +dataFlow.getAppId();
|
|
|
- reqInfo += ((dataFlow.getReqBusiness() == null || dataFlow.getReqBusiness().size() == 0)
|
|
|
- ?dataFlow.getReqData() :dataFlow.getReqBusiness().toJSONString());
|
|
|
+ String reqInfo = dataFlow.getTransactionId() + dataFlow.getAppId();
|
|
|
+ reqInfo += ((dataFlow.getReqBusiness() == null || dataFlow.getReqBusiness().size() == 0)
|
|
|
+ ? dataFlow.getReqData() : dataFlow.getReqBusiness().toJSONString());
|
|
|
reqInfo += dataFlow.getAppRoutes().get(0).getSecurityCode();
|
|
|
return md5(reqInfo);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* dataFlow 对象签名
|
|
|
+ *
|
|
|
* @param dataFlow
|
|
|
* @return
|
|
|
*/
|
|
|
- public static String apiDataFlowMd5(ApiDataFlow dataFlow) throws NoAuthorityException{
|
|
|
- if(dataFlow == null){
|
|
|
- throw new NoAuthorityException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR,"MD5签名过程中出现错误");
|
|
|
+ public static String apiDataFlowMd5(ApiDataFlow dataFlow) throws NoAuthorityException {
|
|
|
+ if (dataFlow == null) {
|
|
|
+ throw new NoAuthorityException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR, "MD5签名过程中出现错误");
|
|
|
}
|
|
|
String reqInfo = dataFlow.getTransactionId() + dataFlow.getRequestTime() + dataFlow.getAppId();
|
|
|
- reqInfo += "GET,DELETE".equals(dataFlow.getRequestHeaders().get(CommonConstant.HTTP_METHOD))?
|
|
|
- dataFlow.getRequestHeaders().get("REQUEST_URL") :dataFlow.getReqData();
|
|
|
+ reqInfo += "GET,DELETE".equals(dataFlow.getRequestHeaders().get(CommonConstant.HTTP_METHOD)) ?
|
|
|
+ dataFlow.getRequestHeaders().get("REQUEST_URL") : dataFlow.getReqData();
|
|
|
reqInfo += dataFlow.getAppRoutes().get(0).getSecurityCode();
|
|
|
return md5(reqInfo);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* md5加密
|
|
|
+ *
|
|
|
* @param transactionId 流水
|
|
|
- * @param appId 应用ID
|
|
|
- * @param businesses 内容
|
|
|
+ * @param appId 应用ID
|
|
|
+ * @param businesses 内容
|
|
|
* @return
|
|
|
*/
|
|
|
- public static String md5(String transactionId,String appId,String businesses,String code){
|
|
|
- return md5(transactionId+appId+businesses+code).toLowerCase();
|
|
|
+ public static String md5(String transactionId, String appId, String businesses, String code) {
|
|
|
+ return md5(transactionId + appId + businesses + code).toLowerCase();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 添加 sign
|
|
|
+ *
|
|
|
* @param dataFlow
|
|
|
* @param responseJson
|
|
|
*/
|
|
|
- public static void putSign(DataFlow dataFlow,JSONObject responseJson){
|
|
|
+ public static void putSign(DataFlow dataFlow, JSONObject responseJson) {
|
|
|
JSONObject orders = responseJson.getJSONObject("orders");
|
|
|
JSONArray business = responseJson.getJSONArray("business");
|
|
|
- if(dataFlow == null || dataFlow.getAppRoutes() == null || dataFlow.getAppRoutes().size() == 0 || StringUtil.isNullOrNone(dataFlow.getAppRoutes().get(0).getSecurityCode())) {
|
|
|
+ if (dataFlow == null || dataFlow.getAppRoutes() == null || dataFlow.getAppRoutes().size() == 0 || StringUtil.isNullOrNone(dataFlow.getAppRoutes().get(0).getSecurityCode())) {
|
|
|
/*orders.put("sign", AuthenticationFactory.md5(orders.getString("transactionId"), orders.getString("responseTime"),
|
|
|
business.toJSONString(), MappingCache.getValue(MappingConstant.KEY_DEFAULT_SECURITY_CODE)));*/
|
|
|
- orders.put("sign","");
|
|
|
- }else {
|
|
|
+ orders.put("sign", "");
|
|
|
+ } else {
|
|
|
orders.put("sign", AuthenticationFactory.md5(orders.getString("transactionId"), orders.getString("responseTime"),
|
|
|
- business == null ?"":business.toJSONString(), dataFlow.getAppRoutes().get(0).getSecurityCode()));
|
|
|
+ business == null ? "" : business.toJSONString(), dataFlow.getAppRoutes().get(0).getSecurityCode()));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 添加 sign
|
|
|
+ *
|
|
|
* @param dataFlow
|
|
|
* @param headers
|
|
|
*/
|
|
|
- public static void putSign(DataFlow dataFlow,Map<String,String> headers){
|
|
|
- if(dataFlow == null || dataFlow.getAppRoutes() == null || dataFlow.getAppRoutes().size() == 0 || StringUtil.isNullOrNone(dataFlow.getAppRoutes().get(0).getSecurityCode())) {
|
|
|
- headers.put("resSign","");
|
|
|
- }else {
|
|
|
+ public static void putSign(DataFlow dataFlow, Map<String, String> headers) {
|
|
|
+ if (dataFlow == null || dataFlow.getAppRoutes() == null || dataFlow.getAppRoutes().size() == 0 || StringUtil.isNullOrNone(dataFlow.getAppRoutes().get(0).getSecurityCode())) {
|
|
|
+ headers.put("resSign", "");
|
|
|
+ } else {
|
|
|
headers.put("resSign", AuthenticationFactory.md5(dataFlow.getTransactionId(), headers.get("responseTime"),
|
|
|
dataFlow.getResData(), dataFlow.getAppRoutes().get(0).getSecurityCode()));
|
|
|
}
|
|
|
@@ -139,6 +146,7 @@ public class AuthenticationFactory {
|
|
|
|
|
|
/**
|
|
|
* 加密
|
|
|
+ *
|
|
|
* @param data
|
|
|
* @param publicKey
|
|
|
* @param keySize
|
|
|
@@ -146,8 +154,7 @@ public class AuthenticationFactory {
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
public static byte[] encrypt(byte[] data, PublicKey publicKey, int keySize)
|
|
|
- throws Exception
|
|
|
- {
|
|
|
+ throws Exception {
|
|
|
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING", "BC");
|
|
|
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
|
|
|
|
|
|
@@ -161,7 +168,7 @@ public class AuthenticationFactory {
|
|
|
byte[] buf;
|
|
|
if (inputLen - offSet > blockSize) {
|
|
|
buf = cipher.doFinal(data, offSet, blockSize);
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
buf = cipher.doFinal(data, offSet, inputLen - offSet);
|
|
|
}
|
|
|
out.write(buf, 0, buf.length);
|
|
|
@@ -175,6 +182,7 @@ public class AuthenticationFactory {
|
|
|
|
|
|
/**
|
|
|
* 解密
|
|
|
+ *
|
|
|
* @param data
|
|
|
* @param privateKey
|
|
|
* @param keySize
|
|
|
@@ -182,8 +190,7 @@ public class AuthenticationFactory {
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
public static byte[] decrypt(byte[] data, PrivateKey privateKey, int keySize)
|
|
|
- throws Exception
|
|
|
- {
|
|
|
+ throws Exception {
|
|
|
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING", "BC");
|
|
|
cipher.init(Cipher.DECRYPT_MODE, privateKey);
|
|
|
int blockSize = keySize >> 3;
|
|
|
@@ -202,19 +209,19 @@ public class AuthenticationFactory {
|
|
|
|
|
|
/**
|
|
|
* 加载公钥
|
|
|
+ *
|
|
|
* @param keyData
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
public static PublicKey loadPubKey(String keyData)
|
|
|
- throws Exception
|
|
|
- {
|
|
|
+ throws Exception {
|
|
|
return loadPemPublicKey(keyData, "RSA");
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 加载私钥
|
|
|
-
|
|
|
+ *
|
|
|
* @param keyData
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
@@ -225,14 +232,14 @@ public class AuthenticationFactory {
|
|
|
|
|
|
/**
|
|
|
* 加载私钥
|
|
|
+ *
|
|
|
* @param privateKeyPem
|
|
|
* @param algorithm
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
public static PrivateKey loadPrivateKeyPkcs8(String privateKeyPem, String algorithm)
|
|
|
- throws Exception
|
|
|
- {
|
|
|
+ throws Exception {
|
|
|
String privateKeyData = privateKeyPem.replace("-----BEGIN PRIVATE KEY-----", "");
|
|
|
privateKeyData = privateKeyData.replace("-----END PRIVATE KEY-----", "");
|
|
|
privateKeyData = privateKeyData.replace("\n", "");
|
|
|
@@ -248,14 +255,14 @@ public class AuthenticationFactory {
|
|
|
|
|
|
/**
|
|
|
* 加载公钥
|
|
|
+ *
|
|
|
* @param publicPemData
|
|
|
* @param algorithm
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
public static PublicKey loadPemPublicKey(String publicPemData, String algorithm)
|
|
|
- throws Exception
|
|
|
- {
|
|
|
+ throws Exception {
|
|
|
String publicKeyPEM = publicPemData.replace("-----BEGIN PUBLIC KEY-----", "");
|
|
|
|
|
|
publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", "");
|
|
|
@@ -263,7 +270,7 @@ public class AuthenticationFactory {
|
|
|
publicKeyPEM = publicKeyPEM.replace("\n", "");
|
|
|
publicKeyPEM = publicKeyPEM.replace("\r", "");
|
|
|
|
|
|
- byte[] decoded =Base64.getDecoder().decode(publicKeyPEM.getBytes());
|
|
|
+ byte[] decoded = Base64.getDecoder().decode(publicKeyPEM.getBytes());
|
|
|
|
|
|
X509EncodedKeySpec spec = new X509EncodedKeySpec(decoded);
|
|
|
KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
|
|
|
@@ -272,20 +279,21 @@ public class AuthenticationFactory {
|
|
|
}
|
|
|
|
|
|
//生成密钥对
|
|
|
- private static KeyPair genKeyPair(int keyLength) throws Exception{
|
|
|
- KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
|
|
|
+ private static KeyPair genKeyPair(int keyLength) throws Exception {
|
|
|
+ KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
|
|
|
keyPairGenerator.initialize(1024);
|
|
|
return keyPairGenerator.generateKeyPair();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 用户密码
|
|
|
+ *
|
|
|
* @param userPwd
|
|
|
* @return
|
|
|
*/
|
|
|
- public static String md5UserPassword(String userPwd){
|
|
|
+ public static String md5UserPassword(String userPwd) {
|
|
|
String userPasswordSecret = MappingCache.getValue(MappingConstant.KEY_USER_PASSWORD_SECRET);
|
|
|
- if(StringUtil.isNullOrNone(userPasswordSecret)){
|
|
|
+ if (StringUtil.isNullOrNone(userPasswordSecret)) {
|
|
|
userPasswordSecret = CommonConstant.DEFAULT_USER_PWD_SECRET;
|
|
|
}
|
|
|
return md5(md5(userPwd + userPasswordSecret));
|
|
|
@@ -293,33 +301,34 @@ public class AuthenticationFactory {
|
|
|
|
|
|
/**
|
|
|
* 创建token
|
|
|
+ *
|
|
|
* @return
|
|
|
*/
|
|
|
- public static String createAndSaveToken(Map<String,String> info) throws Exception{
|
|
|
+ public static String createAndSaveToken(Map<String, String> info) throws Exception {
|
|
|
|
|
|
- if(!info.containsKey(CommonConstant.LOGIN_USER_ID)){
|
|
|
- throw new InvalidParameterException("参数中没有包含:"+CommonConstant.LOGIN_USER_ID);
|
|
|
+ if (!info.containsKey(CommonConstant.LOGIN_USER_ID)) {
|
|
|
+ throw new InvalidParameterException("参数中没有包含:" + CommonConstant.LOGIN_USER_ID);
|
|
|
}
|
|
|
|
|
|
- String jdi = UUID.randomUUID().toString().replace("-","");
|
|
|
+ String jdi = UUID.randomUUID().toString().replace("-", "");
|
|
|
String jwtSecret = MappingCache.getValue(MappingConstant.KEY_JWT_SECRET);
|
|
|
- if(StringUtil.isNullOrNone(jwtSecret)){
|
|
|
+ if (StringUtil.isNullOrNone(jwtSecret)) {
|
|
|
jwtSecret = CommonConstant.DEFAULT_JWT_SECRET;
|
|
|
}
|
|
|
Algorithm algorithm = Algorithm.HMAC256(jwtSecret);
|
|
|
- JWTCreator.Builder jwt= JWT.create();
|
|
|
- for(String key:info.keySet()){
|
|
|
- if(CommonConstant.LOGIN_USER_ID.equals(key)){
|
|
|
+ JWTCreator.Builder jwt = JWT.create();
|
|
|
+ for (String key : info.keySet()) {
|
|
|
+ if (CommonConstant.LOGIN_USER_ID.equals(key)) {
|
|
|
continue;
|
|
|
}
|
|
|
- jwt.withClaim(key,info.get(key));
|
|
|
+ jwt.withClaim(key, info.get(key));
|
|
|
}
|
|
|
String expireTime = MappingCache.getValue(MappingConstant.KEY_JWT_EXPIRE_TIME);
|
|
|
- if(StringUtil.isNullOrNone(expireTime)){
|
|
|
+ if (StringUtil.isNullOrNone(expireTime)) {
|
|
|
expireTime = CommonConstant.DEFAULT_JWT_EXPIRE_TIME;
|
|
|
}
|
|
|
//保存token Id
|
|
|
- JWTCache.setValue(jdi,info.get(CommonConstant.LOGIN_USER_ID),Integer.parseInt(expireTime));
|
|
|
+ JWTCache.setValue(jdi, info.get(CommonConstant.LOGIN_USER_ID), Integer.parseInt(expireTime));
|
|
|
jwt.withIssuer("java110");
|
|
|
jwt.withJWTId(jdi);
|
|
|
return jwt.sign(algorithm);
|
|
|
@@ -327,13 +336,14 @@ public class AuthenticationFactory {
|
|
|
|
|
|
/**
|
|
|
* 删除Token
|
|
|
+ *
|
|
|
* @param token
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
- public static void deleteToken(String token) throws Exception{
|
|
|
+ public static void deleteToken(String token) throws Exception {
|
|
|
String jwtSecret = MappingCache.getValue(MappingConstant.KEY_JWT_SECRET);
|
|
|
- if(StringUtil.isNullOrNone(jwtSecret)){
|
|
|
+ if (StringUtil.isNullOrNone(jwtSecret)) {
|
|
|
jwtSecret = CommonConstant.DEFAULT_JWT_SECRET;
|
|
|
}
|
|
|
Algorithm algorithm = Algorithm.HMAC256(jwtSecret);
|
|
|
@@ -342,20 +352,21 @@ public class AuthenticationFactory {
|
|
|
String jdi = jwt.getId();
|
|
|
//保存token Id
|
|
|
String userId = JWTCache.getValue(jdi);
|
|
|
- if(!StringUtil.isNullOrNone(userId)){ //说明redis中jdi 已经失效
|
|
|
+ if (!StringUtil.isNullOrNone(userId)) { //说明redis中jdi 已经失效
|
|
|
JWTCache.removeValue(jdi);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 校验Token
|
|
|
+ *
|
|
|
* @param token
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
- public static Map<String, String> verifyToken(String token) throws Exception{
|
|
|
+ public static Map<String, String> verifyToken(String token) throws Exception {
|
|
|
String jwtSecret = MappingCache.getValue(MappingConstant.KEY_JWT_SECRET);
|
|
|
- if(StringUtil.isNullOrNone(jwtSecret)){
|
|
|
+ if (StringUtil.isNullOrNone(jwtSecret)) {
|
|
|
jwtSecret = CommonConstant.DEFAULT_JWT_SECRET;
|
|
|
}
|
|
|
Algorithm algorithm = Algorithm.HMAC256(jwtSecret);
|
|
|
@@ -364,22 +375,22 @@ public class AuthenticationFactory {
|
|
|
String jdi = jwt.getId();
|
|
|
//保存token Id
|
|
|
String userId = JWTCache.getValue(jdi);
|
|
|
- if(StringUtil.isNullOrNone(userId)){
|
|
|
+ if (StringUtil.isNullOrNone(userId)) {
|
|
|
throw new JWTVerificationException("用户还未登录");
|
|
|
}
|
|
|
String expireTime = MappingCache.getValue(MappingConstant.KEY_JWT_EXPIRE_TIME);
|
|
|
- if(StringUtil.isNullOrNone(expireTime)){
|
|
|
+ if (StringUtil.isNullOrNone(expireTime)) {
|
|
|
expireTime = CommonConstant.DEFAULT_JWT_EXPIRE_TIME;
|
|
|
}
|
|
|
//刷新过时时间
|
|
|
- JWTCache.resetExpireTime(jdi,Integer.parseInt(expireTime));
|
|
|
+ JWTCache.resetExpireTime(jdi, Integer.parseInt(expireTime));
|
|
|
Map<String, Claim> claims = jwt.getClaims();
|
|
|
// Add the claim to request header
|
|
|
- Map<String,String> paramOut = new HashMap<String, String>();
|
|
|
- for(String key : claims.keySet()){
|
|
|
- paramOut.put(key,claims.get(key).asString());
|
|
|
+ Map<String, String> paramOut = new HashMap<String, String>();
|
|
|
+ for (String key : claims.keySet()) {
|
|
|
+ paramOut.put(key, claims.get(key).asString());
|
|
|
}
|
|
|
- paramOut.put(CommonConstant.LOGIN_USER_ID,userId);
|
|
|
+ paramOut.put(CommonConstant.LOGIN_USER_ID, userId);
|
|
|
return paramOut;
|
|
|
}
|
|
|
|
|
|
@@ -387,18 +398,17 @@ public class AuthenticationFactory {
|
|
|
/***********************************JWT start***************************************/
|
|
|
|
|
|
|
|
|
-
|
|
|
/***********************************JWT end***************************************/
|
|
|
- public static void main(String[] args) throws Exception{
|
|
|
- KeyPair keyPair=genKeyPair(1024);
|
|
|
+ public static void main(String[] args) throws Exception {
|
|
|
+ KeyPair keyPair = genKeyPair(1024);
|
|
|
|
|
|
//获取公钥,并以base64格式打印出来
|
|
|
- PublicKey publicKey=keyPair.getPublic();
|
|
|
- System.out.println("公钥:"+new String(Base64.getEncoder().encode(publicKey.getEncoded())));
|
|
|
+ PublicKey publicKey = keyPair.getPublic();
|
|
|
+ System.out.println("公钥:" + new String(Base64.getEncoder().encode(publicKey.getEncoded())));
|
|
|
|
|
|
//获取私钥,并以base64格式打印出来
|
|
|
- PrivateKey privateKey=keyPair.getPrivate();
|
|
|
- System.out.println("私钥:"+new String(Base64.getEncoder().encode(privateKey.getEncoded())));
|
|
|
+ PrivateKey privateKey = keyPair.getPrivate();
|
|
|
+ System.out.println("私钥:" + new String(Base64.getEncoder().encode(privateKey.getEncoded())));
|
|
|
|
|
|
}
|
|
|
}
|