Jwt.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package com.sooka.common.jwt;
  2. import com.alibaba.fastjson.JSON;
  3. import com.nimbusds.jose.*;
  4. import com.nimbusds.jose.crypto.MACSigner;
  5. import com.nimbusds.jose.crypto.MACVerifier;
  6. import com.sooka.common.jwt.vo.PayloadVo;
  7. import com.sooka.common.jwt.vo.ResultVo;
  8. import java.util.Date;
  9. import java.util.Map;
  10. /**
  11. * Description:jwt
  12. *
  13. *
  14. * @create 2017-04-05
  15. **/
  16. public class Jwt {
  17. /**
  18. * 秘钥
  19. */
  20. private static final byte[] SECRET="z122NNNlasewqWWefffdmhjSDccsdsa9//*-".getBytes();
  21. /**
  22. * 初始化head部分的数据为
  23. * {
  24. * "alg":"HS256",
  25. * "type":"JWT"
  26. * }
  27. */
  28. private static final JWSHeader header=new JWSHeader(JWSAlgorithm.HS256, JOSEObjectType.JWT, null, null, null, null, null, null, null, null, null, null, null);
  29. /**
  30. *生成Token
  31. * @param payload
  32. * @return
  33. */
  34. public static String createToken(PayloadVo payload) {
  35. String tokenString=null;
  36. // 创建一个 JWS object
  37. JWSObject jwsObject = new JWSObject(header, new Payload(JSON.toJSONString(payload)));
  38. try {
  39. // 将jwsObject 进行HMAC签名
  40. jwsObject.sign(new MACSigner(SECRET));
  41. tokenString=jwsObject.serialize();
  42. } catch (JOSEException e) {
  43. System.err.println("签名失败:" + e.getMessage());
  44. e.printStackTrace();
  45. }
  46. return tokenString;
  47. }
  48. /**
  49. *生成Token
  50. * @param map
  51. * @return
  52. */
  53. public static String createToken(Map map) {
  54. String tokenString=null;
  55. // 创建一个 JWS object
  56. JWSObject jwsObject = new JWSObject(header, new Payload(JSON.toJSONString(map)));
  57. try {
  58. // 将jwsObject 进行HMAC签名
  59. jwsObject.sign(new MACSigner(SECRET));
  60. tokenString=jwsObject.serialize();
  61. } catch (JOSEException e) {
  62. System.err.println("签名失败:" + e.getMessage());
  63. e.printStackTrace();
  64. }
  65. return tokenString;
  66. }
  67. /**
  68. * 校验token是否合法,返回Map集合,集合中主要包含 state状态码 data鉴权成功后从token中提取的数据
  69. * 该方法在过滤器中调用,每次请求API时都校验
  70. * @param token
  71. * @return Map<String, Object>
  72. */
  73. public static ResultVo validToken(String token) {
  74. ResultVo result = new ResultVo();
  75. try {
  76. JWSObject jwsObject = JWSObject.parse(token);
  77. Payload payload = jwsObject.getPayload();
  78. PayloadVo payloadVo = JSON.parseObject(String.valueOf(payload.toJSONObject()),PayloadVo.class);
  79. JWSVerifier verifier = new MACVerifier(SECRET);
  80. if (jwsObject.verify(verifier)) {
  81. // token校验成功(此时没有校验是否过期)
  82. result.setStatus(TokenState.VALID.toString());
  83. // 若payload包含ext字段,则校验是否过期
  84. if (payloadVo.getExt()!=0) {
  85. long curTime = System.currentTimeMillis();
  86. // 过期了
  87. if (curTime > payloadVo.getExt()) {
  88. result.setStatus(TokenState.EXPIRED.toString());
  89. }
  90. }
  91. result.setPayloadVo(payloadVo);
  92. } else {
  93. // 校验失败
  94. result.setStatus(TokenState.INVALID.toString());
  95. }
  96. } catch (Exception e) {
  97. e.printStackTrace();
  98. result.setStatus(TokenState.INVALID.toString());
  99. }
  100. return result;
  101. }
  102. }