0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

JWT的认证流程

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 15:01 次阅读

今天带大家来认识一下JWT。

JWT简介

JWT(Json Web Token)是为了在网络应用环境间传递声明而执行的一种基于 Json 的开放标准。JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。

基于token的鉴权机制

基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,由服务器通过秘钥(serectkey)然后把用户id以及其他信息包装进行一系列的加密算法生成,用户登录的成功,顺带把这个token返回到客户端,用户以后拿着token来访问相关资源,服务器接收到token,通过serectkey然后通过特定算法,解析出这个token中的用户id,解析成功!那么这个人就是该用户,然后通过解析出的id进行该用户的相关操作。这就为应用的扩展提供了便利。

JWT的认证流程如下:

  1. 首先,前端通过Web表单将自己的用户名和密码发送到后端的接口,这个过程一般是一个POST请求
  2. 后端核对用户名和密码成功后,将包含用户信息的数据作为JWT的Payload,将其与JWT Header分别进行Base64编码拼接后签名,形成一个JWT Token,形成的JWT Token就是一个如同{header}.{payload}.{signature}的字符串后端将JWT Token字符串作为登录成功的结果返回给前端。前端可以将返回的结果保存在浏览器中,退出登录时删除保存的JWT Token即可.
  3. 前端在每次请求时将JWT Token放入HTTP请求头中,后端检查前端传过来的JWT Token,验证其有效性,比如检查签名是否正确、是否过期、token的接收方是否是自己等等
  4. 验证通过后,后端解析出JWT Token中包含的用户信息,进行其他逻辑操作(一般是根据用户信息得到权限等),返回结果

注:这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做

就可以了Access-Control-Allow-Origin:

JWT的构成

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJ0ZXN0OTUyNyIsImlhdCI6MTY1NjU1OTY2OCwic3ViIjoie1widXNlcklkXCI6XCI5NTI3XCIsXCJ1c2VyTmFtZVwiOlwidGVzdDk1MjdcIn0iLCJleHAiOjE2NTY1NjE0Njh9.7oot0glDxaL-g7pOJ2mZld2VLRhpo0h5y_BbVI4ZolA

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload,类似于飞机上承载的物品),第三部分是签证(signature)。

头部(header)

jwt的头部承载两部分信息:

  • 声明类型,这里是jwt
  • 声明加密的算法,通常直接使用 HMAC SHA256。这的加密算法也就是签名算法。

{ "alg":"HS256" } 经过Base64编码之后 ewogICAgImFsZyI6IkhTMjU2Igp9

载荷(payload)

载荷就是存放有效信息的地方。这些有效信息包含三个部分

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明
{
    "sub":{"userId":"9527","userName":"test9527"},
    "exp":1656561468,
    "iat":1656559668,
    "jti":"test9527"
}
  • sub: 主体,一般是用户信息,最好不要放入敏感信息
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识

签证(signature)

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。signature顾名思义就是签名,签名一般就是用一些算法生成一个能够认证身份的字符串,secret配置在服务器端,不能泄露出去,就可以自己给自己签发token了。

JWT的使用(JAVA


创建一个新项目,引入jwt包

< dependency >
    < groupId >io.jsonwebtoken< /groupId >
    < artifactId >jjwt< /artifactId >
    < version >0.9.0< /version >
< /dependency >

JWT工具类:

public class JwtUtil {
    //加密 解密时的密钥 用来生成key
    public static final String JWT_KEY = "secret";
     // 过期时间30分钟
    private static final long EXPIRE_TIME = 30 * 60 * 1000;
      //生成加密后的秘钥 secretKey
      
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }
    public static String createJWT(String id, String subject){
   
           //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
           SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
           //生成JWT的时间
           long nowMillis = System.currentTimeMillis();
           Date now = new Date(nowMillis);
           //生成签名的时候使用的秘钥secret,这个方法本地封装了的,一般可以从本地配置文件中读取,切记这个秘钥不能外露哦。它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
           SecretKey key = generalKey();
           //这里其实就是new一个JwtBuilder,设置jwt的body
           JwtBuilder builder = Jwts.builder()
           //如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
                   .setClaims(claims)
           //设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击。
                   .setId(id)
           //iat: jwt的签发时间
                   .setIssuedAt(now)
           //sub(Subject):代表这个JWT的主体,即它的所有人,这个是一个json格式的字符串,可以存放什么userid,roldid之类的,作为什么用户的唯一标志。
                   .setSubject(subject)
           //设置签名使用的签名算法和签名使用的秘钥
                   .signWith(signatureAlgorithm, key);
   
               long expMillis = nowMillis + EXPIRE_TIME;
               Date exp = new Date(expMillis);
               //设置过期时间
               builder.setExpiration(exp);
           //就开始压缩为xxxxxxxxxxxxxx.xxxxxxxxxxxxxxx.xxxxxxxxxxxxx这样的jwt
           return builder.compact();
       }
    /**
     * 获得token中的信息无需secret解密也能获得
     * token中包含的用户名
     */
    public static String getUsername(String token) {
        try {
            DecodedJWT jwt = JWT._decode_(token);
            return jwt.getClaim("userName").asString();
        } catch (JWTDecodeException e) {
            return null;
        }
    }
}

  • 创建controller类
  • 图片
    访问测试
    图片
    拿到的token可以使用Base64解码,可以看到,能看到用户信息,所以,token中不要带有敏感信息,防止泄露。
    图片
    使用该token调用getUser接口,可以正确解析
    图片
    下面我们不使用getToken获取token,而是伪造一个token,
{
    "sub":{
        "userId":"001",
        "userName":"test001"
    },
    "exp":1656561468,
    "iat":1656559668,
    "jti":"test001"
}

图片

再组合header,payload和signature,得到新的token访问getUser

eyJhbGciOiJIUzI1NiJ9.ewogICAgInN1YiI6ewogICAgICAgICJ1c2VySWQiOiIwMDEiLAogICAgICAgICJ1c2VyTmFtZSI6InRlc3QwMDEiCiAgICB9LAogICAgImV4cCI6MTY1NjU2MTQ2OCwKICAgICJpYXQiOjE2NTY1NTk2NjgsCiAgICAianRpIjoidGVzdDAwMSIKfQ==.7oot0glDxaL-g7pOJ2mZld2VLRhpo0h5y_BbVI4ZolA

得到结果如下:无法正确解析token,说明此token无效最后, JWT过期时间要设置适宜 ,过长,可能会被截取到,造成用户信息泄露安全等问题;过短用户体验不佳。

图片

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7643

    浏览量

    148520
  • 服务器
    +关注

    关注

    12

    文章

    8123

    浏览量

    82534
  • 客户端
    +关注

    关注

    1

    文章

    282

    浏览量

    16343
收藏 人收藏

    评论

    相关推荐

    蓝牙BQB认证流程

    蓝牙BQB认证流程
    发表于 11-07 10:43

    jw和e^jwt的一些理解

    转昨晚看到《电磁场与电磁波》时变电磁场一章,书中又一次出现了jw和e^jwt,之前一直无法理解诸如为什么电感的阻抗可以表示成jwL之类的问题,jw是从哪里推导出来的呢?为什么可以直接与L相乘呢?
    发表于 05-23 07:39

    FCC认证大概多少钱?流程是什么?

    类:SDoC 、ID。 二 、FCC认证流程:1.提交请求表,签订合同;2.预备检测样品(无线产品需要定频机),并供给产品材料;3.出具草稿陈述,客户承认,签发正式陈述;4.如果是FCC sDoC,则项目
    发表于 05-28 14:03

    BLE资格认证流程介绍

    BLE 资格认证流程说明
    发表于 12-14 07:12

    3C认证流程及费用

    3C认证流程及费用 简单介绍规则及相关注意事项
    发表于 02-23 17:42 3次下载

    如何做CE认证呢,CE认证流程是什么,CE认证在哪做?

    如何做CE认证呢,CE认证流程是什么,CE认证在哪做?优耐检测是一家独立的第三方检测及认证机构,拥有完善的电磁兼容(EMC),安全(SAFE
    发表于 12-29 09:26 691次阅读

    JWT-II智能测量系统使用说明书

    JWT-II智能测量系统使用说明书
    发表于 07-31 17:07 3次下载

    如何才能保证JWT安全

    jwt是什么? JWTs是JSON对象的编码表示。JSON对象由零或多个名称/值对组成,其中名称为字符串,值为任意JSON值。JWT有助于在clear(例如在URL中)发送这样的信息,可以被信任
    的头像 发表于 09-29 15:09 3014次阅读

    MicroProfile JWT Auth MicroProfile的JWT RBAC规范

    microprofile-jwt-auth.zip
    发表于 05-07 10:04 0次下载
    MicroProfile <b class='flag-5'>JWT</b> Auth MicroProfile的<b class='flag-5'>JWT</b> RBAC规范

    jwt-auth基于ThinkPHP的jwt框架

    ./oschina_soft/gitee-jwt-auth.zip
    发表于 06-30 09:10 1次下载
    <b class='flag-5'>jwt</b>-auth基于ThinkPHP的<b class='flag-5'>jwt</b>框架

    为何JWT不适合存储Session

    很多人错误地尝试比较 Cookies 和 JWT。这种对比毫无意义,就像对比内存和硬盘一样。Cookies 是一种存储机制,然而 JWT Tokens 是被加密并签名后的令牌。
    的头像 发表于 11-28 10:23 425次阅读

    JJWT是什么?如何保证 JWT 安全

    JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。
    发表于 03-03 15:12 646次阅读

    后端JWT接口认证的操作流程

    流程 2. JWT 介绍 JWT 全称为 JSON Web Token,是目前主流的跨域认证解决方案 数据结构由 3 部分组成,中间由「 **. ** 」分割开 它们分别是: Head
    的头像 发表于 10-31 11:20 319次阅读

    什么是JWTJWT由哪些部分组成?JWT如何进行用户认证

    JWT(JSON Web Token)是一个开放的行业标准(RFC 7519),自身包含了身份验证所需要的所有信息,因此我们的服务器不需要存储用户Session信息。
    的头像 发表于 02-25 09:44 352次阅读
    什么是<b class='flag-5'>JWT</b>?<b class='flag-5'>JWT</b>由哪些部分组成?<b class='flag-5'>JWT</b>如何进行用户<b class='flag-5'>认证</b>?

    POS机做CCC认证认证标准与申请流程

    POS机申请CCC认证有哪些认证标准?在申请流程上跟其他类型产品又存在哪些区别?POS机是现代商业中不可或缺的支付终端设备,它在中国市场销售需要通过CCC认证。下面英利检测将介绍POS
    的头像 发表于 03-05 17:46 713次阅读
    POS机做CCC<b class='flag-5'>认证</b>的<b class='flag-5'>认证</b>标准与申请<b class='flag-5'>流程</b>