JWTUtils.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package com.icontrols.oauth.utils;
  2. import java.io.UnsupportedEncodingException;
  3. import java.security.GeneralSecurityException;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.util.Base64;
  6. import java.util.Date;
  7. import java.util.Base64.Decoder;
  8. import org.json.JSONObject;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import com.icontrols.oauth.constants.CONSTANTS;
  12. import com.icontrols.oauth.controller.ViewController;
  13. import com.icontrols.oauth.model.JWTInfo;
  14. import io.jsonwebtoken.Jwts;
  15. import io.jsonwebtoken.SignatureAlgorithm;
  16. public class JWTUtils {
  17. private static final Logger logger = LoggerFactory.getLogger(JWTUtils.class);
  18. public JWTUtils() {
  19. super();
  20. }
  21. // // icontrols1793!@# base64인코딩하고앞에 난수(dlswmd) 붙임
  22. // public static String ACCESS_TOEKN_SECRET_KEY = "dlswmdaWNvbnRyb2xzMTc5MyFAIw==";
  23. // // icontrolsrefresh1793!@#
  24. // public static String REFRESH_TOKEN_SECRET_KEY = "aWNvbnRyb2xzcmVmcmVzaDE3OTMhQCM=";
  25. static public String generateToken(JWTInfo info, String type) throws UnsupportedEncodingException {
  26. String secretKey = "";
  27. String jwt = "";
  28. if (type.equals("accessToken")) {
  29. secretKey = CONSTANTS.ACCESS_TOEKN_SECRET_KEY;
  30. jwt = Jwts.builder().setExpiration(new Date(3600000)) // 1시간 -> 설정정보로 변경해야함
  31. .claim("cmpIp", info.getCmpIp()).claim("homeId", info.getHomeId())
  32. .claim("iat", System.currentTimeMillis() / 1000)
  33. .signWith(SignatureAlgorithm.HS256, secretKey.getBytes("UTF-8")).compact();
  34. } else if (type.equals("refreshToken")) {
  35. secretKey = CONSTANTS.REFRESH_TOKEN_SECRET_KEY;
  36. jwt = Jwts.builder().setExpiration(new Date(43200000)) // 1일 -> 설정정보로 변경해야함
  37. .claim("cmpIp", info.getCmpIp()).claim("homeId", info.getHomeId())
  38. .claim("iat", System.currentTimeMillis() / 1000)
  39. .signWith(SignatureAlgorithm.HS256, secretKey.getBytes("UTF-8")).compact();
  40. }
  41. return jwt;
  42. }
  43. static public boolean validateToken(String token, String type) throws UnsupportedEncodingException {
  44. String secretKey = "";
  45. if (type.equals("accessToken")) {
  46. secretKey = CONSTANTS.ACCESS_TOEKN_SECRET_KEY;
  47. } else if (type.equals("refreshToken")) {
  48. secretKey = CONSTANTS.REFRESH_TOKEN_SECRET_KEY;
  49. }
  50. logger.info(token);
  51. Decoder decoder = Base64.getDecoder();
  52. // 시그니처가 맞는지 확인
  53. String enHeader = token.split("\\.")[0];
  54. logger.info("H= " + enHeader);
  55. String enPayload = token.split("\\.")[1];
  56. String dePayload = new String(decoder.decode(enPayload));
  57. logger.info("P= " + enPayload);
  58. String signiture = token.split("\\.")[2];
  59. logger.info("S= " + signiture);
  60. JSONObject obj = new JSONObject(dePayload);
  61. String jwt = Jwts.builder().claim("exp", obj.get("exp")) // 1시간 -> 설정정보로 변경해야함
  62. .claim("cmpIp", obj.get("cmpIp")).claim("homeId", obj.get("homeId")).claim("iat", obj.get("iat"))
  63. .signWith(SignatureAlgorithm.HS256, secretKey.getBytes("UTF-8")).compact();
  64. logger.info("new = " + jwt);
  65. if (token.equals(jwt)) {
  66. long iat = Long.parseLong(obj.get("iat").toString());
  67. long currentTime = System.currentTimeMillis() / 1000;
  68. if (currentTime > iat + Long.parseLong(obj.get("exp").toString())) {
  69. return false;
  70. }
  71. return true;
  72. }
  73. return false;
  74. }
  75. static public JWTInfo getJWTInfoFromToken(String token) {
  76. Decoder decoder = Base64.getDecoder();
  77. String enPayload = token.split("\\.")[1];
  78. String dePayload = new String(decoder.decode(enPayload));
  79. logger.info("P= " + enPayload);
  80. JSONObject obj = new JSONObject(dePayload);
  81. JWTInfo jwtInfo = new JWTInfo();
  82. jwtInfo.setCmpIp(obj.get("cmpIp").toString());
  83. jwtInfo.setHomeId(obj.get("homeId").toString());
  84. return jwtInfo;
  85. }
  86. static public String getCmpIpFromToken(String token) {
  87. Decoder decoder = Base64.getDecoder();
  88. String enPayload = token.split("\\.")[1];
  89. String dePayload = new String(decoder.decode(enPayload));
  90. logger.info("P= " + enPayload);
  91. JSONObject obj = new JSONObject(dePayload);
  92. String cmpIp = obj.get("cmpIp").toString();
  93. Decoder dcoder = Base64.getDecoder();
  94. cmpIp = new String(decoder.decode(cmpIp));
  95. return cmpIp;
  96. }
  97. static public String getHomeIdFromToken(String token)
  98. throws UnsupportedEncodingException, NoSuchAlgorithmException, GeneralSecurityException {
  99. Decoder decoder = Base64.getDecoder();
  100. String enPayload = token.split("\\.")[1];
  101. String dePayload = new String(decoder.decode(enPayload));
  102. JSONObject obj = new JSONObject(dePayload);
  103. String encodedHomeId = obj.get("homeId").toString();
  104. AES256Util aes = new AES256Util();
  105. String homeId = aes.decrypt(encodedHomeId);
  106. return homeId;
  107. }
  108. }