当前位置:   article > 正文

JAVA开发(JWTUtil工具类实现token源码赏析)

JAVA开发(JWTUtil工具类实现token源码赏析)

一、token解决问题的背景:

     1、 单点登录

     2、分布式登录状态,

      3、在信任期内 避免 重新输入用户名密码登录。

     4、跨系统免登陆等。

     5、一些接口的请求权限验证。

总结以上token最终都是为了解决在在分布式系统中信任期内 避免 重新输入用户名密码登录。

二、token的常见验证流程:

1、用户提交用户名、密码到服务器后台。

2、后台验证用户信息的正确性。

3、若用户验证通过,服务器端生成Token,返回到客户端。

4、客户端保存Token,再下一次请求资源时,附带上Token信息。

5、服务器端 验证Token是否由服务器签发的。

6、若Token验证通过,则返回需要的资源。

三、那么如何处理token:

1、解决安全问题,就需要加密,和有效期

2、解决信任问题,就要生产包含用户账号,密码相关的信息

3、解决唯一性问题,就要用到签名

4、解决体验问题,就要使用到自动刷新。

上面4点就是实现token的需求。

四、现在以JWTUtil工具类为例看源码是如何现实的:

1、创建token

源码赏析,一共有4种token生产方式。

从传入参数方式中可以看出主要有两个重要信息。

一个是秘钥(或者签名),一个荷载信息(用户登录的相关信息)。那它就可以成为一个凭证了 。

  1. /**
  2. * 创建HS256(HmacSHA256) JWT Token
  3. *
  4. * @param payload 荷载信息
  5. * @param key HS256(HmacSHA256)密钥
  6. * @return JWT Token
  7. */
  8. public static String createToken(Map<String, Object> payload, byte[] key) {
  9. return createToken(null, payload, key);
  10. }
  11. /**
  12. * 创建HS256(HmacSHA256) JWT Token
  13. *
  14. * @param headers 头信息
  15. * @param payload 荷载信息
  16. * @param key HS256(HmacSHA256)密钥
  17. * @return JWT Token
  18. */
  19. public static String createToken(Map<String, Object> headers, Map<String, Object> payload, byte[] key) {
  20. return JWT.create()
  21. .addHeaders(headers)
  22. .addPayloads(payload)
  23. .setKey(key)
  24. .sign();
  25. }
  26. /**
  27. * 创建JWT Token
  28. *
  29. * @param payload 荷载信息
  30. * @param signer 签名算法
  31. * @return JWT Token
  32. */
  33. public static String createToken(Map<String, Object> payload, JWTSigner signer) {
  34. return createToken(null, payload, signer);
  35. }
  36. /**
  37. * 创建JWT Token
  38. *
  39. * @param headers 头信息
  40. * @param payload 荷载信息
  41. * @param signer 签名算法
  42. * @return JWT Token
  43. */
  44. public static String createToken(Map<String, Object> headers, Map<String, Object> payload, JWTSigner signer) {
  45. return JWT.create()
  46. .addHeaders(headers)
  47. .addPayloads(payload)
  48. .setSigner(signer)
  49. .sign();
  50. }

2、token和转换成可解析对象。

这一步是为了能从token转化出可解析的对象信息。

  1. /**
  2. * 解析JWT Token
  3. *
  4. * @param token token
  5. * @return {@link JWT}
  6. */
  7. public static JWT parseToken(String token) {
  8. return JWT.of(token);
  9. }

3、检验token,对应的有两种。分别是根据秘钥和签名

  1. /**
  2. * 验证JWT Token有效性
  3. *
  4. * @param token JWT Token
  5. * @param key HS256(HmacSHA256)密钥
  6. * @return 是否有效
  7. */
  8. public static boolean verify(String token, byte[] key) {
  9. return JWT.of(token).setKey(key).verify();
  10. }
  11. /**
  12. * 验证JWT Token有效性
  13. *
  14. * @param token JWT Token
  15. * @param signer 签名器
  16. * @return 是否有效
  17. */
  18. public static boolean verify(String token, JWTSigner signer) {
  19. return JWT.of(token).verify(signer);
  20. }

整个工具类完整源码:

  1. package cn.hutool.jwt;
  2. import cn.hutool.jwt.signers.JWTSigner;
  3. import java.util.Map;
  4. /**
  5. * JSON Web Token (JWT)工具类
  6. */
  7. public class JWTUtil {
  8. /**
  9. * 创建HS256(HmacSHA256) JWT Token
  10. *
  11. * @param payload 荷载信息
  12. * @param key HS256(HmacSHA256)密钥
  13. * @return JWT Token
  14. */
  15. public static String createToken(Map<String, Object> payload, byte[] key) {
  16. return createToken(null, payload, key);
  17. }
  18. /**
  19. * 创建HS256(HmacSHA256) JWT Token
  20. *
  21. * @param headers 头信息
  22. * @param payload 荷载信息
  23. * @param key HS256(HmacSHA256)密钥
  24. * @return JWT Token
  25. */
  26. public static String createToken(Map<String, Object> headers, Map<String, Object> payload, byte[] key) {
  27. return JWT.create()
  28. .addHeaders(headers)
  29. .addPayloads(payload)
  30. .setKey(key)
  31. .sign();
  32. }
  33. /**
  34. * 创建JWT Token
  35. *
  36. * @param payload 荷载信息
  37. * @param signer 签名算法
  38. * @return JWT Token
  39. */
  40. public static String createToken(Map<String, Object> payload, JWTSigner signer) {
  41. return createToken(null, payload, signer);
  42. }
  43. /**
  44. * 创建JWT Token
  45. *
  46. * @param headers 头信息
  47. * @param payload 荷载信息
  48. * @param signer 签名算法
  49. * @return JWT Token
  50. */
  51. public static String createToken(Map<String, Object> headers, Map<String, Object> payload, JWTSigner signer) {
  52. return JWT.create()
  53. .addHeaders(headers)
  54. .addPayloads(payload)
  55. .setSigner(signer)
  56. .sign();
  57. }
  58. /**
  59. * 解析JWT Token
  60. *
  61. * @param token token
  62. * @return {@link JWT}
  63. */
  64. public static JWT parseToken(String token) {
  65. return JWT.of(token);
  66. }
  67. /**
  68. * 验证JWT Token有效性
  69. *
  70. * @param token JWT Token
  71. * @param key HS256(HmacSHA256)密钥
  72. * @return 是否有效
  73. */
  74. public static boolean verify(String token, byte[] key) {
  75. return JWT.of(token).setKey(key).verify();
  76. }
  77. /**
  78. * 验证JWT Token有效性
  79. *
  80. * @param token JWT Token
  81. * @param signer 签名器
  82. * @return 是否有效
  83. */
  84. public static boolean verify(String token, JWTSigner signer) {
  85. return JWT.of(token).verify(signer);
  86. }
  87. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/544465
推荐阅读
相关标签
  

闽ICP备14008679号