• Token身份验证


    目录

    一、已经有的验证方式

    1.HTTP Basic Auth 

    2.Cookie Auth

    3.基于 Token 的身份验证方法

    二、Token的内核

    Token机制相对于Cookie机制又有什么好处呢?

    三、基于JWT的Token认证机制实现

    3.1JSON Web Token(JWT)是一个非常轻巧的规范 。JWT 标准的 Token 有三个部分:

    3.1.1Header

    3.1.2Payload

    3.1.3 Signature

    四、JWT的JAVA应用

    1.导入依赖jjwt

    2.创建和解析token

    总结


    一、已经有的验证方式

    参考网页

    JavaWeb—基于Token的身份验证 - 大象踢足球 - 博客园

    1.HTTP Basic Auth 

    HTTP Basic Auth每次请求API时都提供用户的username和password,Basic Auth是配合RESTful API 使用的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此,在开发对外开放的RESTful API时,尽量避免采用HTTP Basic Auth。

    2.Cookie Auth

    Cookie认证为一次请求认证在服务端创建一个Session对象,同时在客户端的浏览器端创建了一个Cookie对象;通过客户端带上来Cookie对象来与服务器端的session对象匹配来实现状态管理的。默认的,当我们关闭浏览器的时候,cookie会被删除。但可以通过修改cookie 的expire time使cookie在一定时间内有效。

    3.基于 Token 的身份验证方法

    1. 客户端使用用户名跟密码请求登录

    2. 服务端收到请求,去验证用户名与密码

    3. 验证成功后,服务端会签发一个 Token然后保存(缓存或者数据库),再把这个 Token 发送给客户端

    4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里

    5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

    6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

    二、Token的内核

    Token机制相对于Cookie机制又有什么好处呢?

    • 支持跨域访问: Cookie是不允许垮域访问的
    • 更适用CDN: 可以通过内容分发网络请求你服务端的所有资料
    • 去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可.
    • CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防范。
    • 性能: 一次网络往返时间(通过数据库查询session信息)总比做一次HMACSHA256计算 的Token验证和解析要费时得多.
    • 基于标准化:你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在多个后端库

    三、基于JWT的Token认证机制实现

    3.1JSON Web Token(JWT)是一个非常轻巧的规范 。JWT 标准的 Token 有三个部分:

    • header (头部)
    • payload (数据)
    • signature (签名)

    3.1.1Header

    唯一在头部里面要包含的是 alg 这个属性、其他的都是一些加密信息

    {

            "alg": "HS256"

    }

    3.1.2Payload

    Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。

    • 标准信息模板
    • iss:Issuer,发行者
    • sub:Subject,主题
    • aud:Audience,观众
    • exp:Expiration time,过期时间
    • nbf:Not before
    • iat:Issued at,发行时间
    • jti:JWT ID

    3.1.3 Signature

    这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。

    四、JWT的JAVA应用

    1.导入依赖jjwt

    JJWT实现了JWT, JWS, JWE 和 JWA RFC规范

    1. #JJWT依赖
    2. <dependency>
    3. <groupId>io.jsonwebtokengroupId>
    4. <artifactId>jjwtartifactId>
    5. <version>版本version>
    6. dependency>

    2.创建和解析token

    1. /**
    2. * 解析JWT
    3. * @param jsonWebToken
    4. * @param base64Security
    5. * @return
    6. */
    7. public static Claims parseJWT(String jsonWebToken, String base64Security) {
    8. try {
    9. Claims claims = Jwts.parser()
    10. .setSigningKey(DatatypeConverter.parseBase64Binary(base64Security))
    11. .parseClaimsJws(jsonWebToken).getBody();
    12. return claims;
    13. } catch (Exception ex) {
    14. return null;
    15. }
    16. }
    17. /**
    18. * 创建JWT
    19. * @param no
    20. * @param userId
    21. * @param issuer
    22. * @param TTLMillis
    23. * @param base64Security
    24. * @return
    25. */
    26. public static String createJWT(String no, String userId,
    27. String issuer, long TTLMillis, String base64Security) {
    28. SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
    29. long nowMillis = System.currentTimeMillis();
    30. Date now = new Date(nowMillis);
    31. //生成签名密钥
    32. byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(base64Security);
    33. Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
    34. //添加构成JWT的参数
    35. JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT")
    36. .claim("no", no)
    37. .setSubject(userId)
    38. .setIssuer(issuer)
    39. .signWith(signatureAlgorithm, signingKey);
    40. //添加Token过期时间
    41. if (TTLMillis >= 0) {
    42. long expMillis = nowMillis + TTLMillis;
    43. Date exp = new Date(expMillis);
    44. builder.setExpiration(exp).setNotBefore(now);
    45. }
    46. //生成JWT
    47. return builder.compact();
    48. }

    总结

    • Token更加能适应我们的前后端分离项目
    • Token相对与Http与Cookie有很好的优点
    • Token能高效的对用户的管理
  • 相关阅读:
    MySQL Create table as select无法执行
    测试用例的设计方法(全):错误推测方法及因果图方法
    五子棋(c语言实现)
    Python语法:如何使用requirements.txt文件在Python环境中安装依赖?
    echars 设置滚动条演示,
    完美解决 Error: Cannot find module ‘@vue/cli-plugin-eslint‘ 报错
    C学生数据库_将链表保存进数据库
    jstack(查看线程)、jmap(查看内存)和jstat(性能分析)
    【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter8-管理文件系统
    Spring Boot 自定义配置元数据
  • 原文地址:https://blog.csdn.net/qq2844509367/article/details/127926275