问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在Java 中创建和验证JWT

发布网友 发布时间:2022-04-23 10:42

我来回答

3个回答

懂视网 时间:2022-04-18 17:22

本篇文章给大家带来的内容是关于JWT原理和简单应用的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

JWT认证登录

最近在做一个审核系统,后台登录用到JWT登录认证,在此主要做个总结

JWT是什么

Json web token (JWT), 根据官网的定义,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

为什么使用JWT

此处主要和传统的session作对比,传统的session在服务器端需要保存一些登录信息,通常是在内存中,在后端服务器是集群等分布式的情况下,其他主机没有保存这些信息,所以都需要通过一个固定的主机进行验证,如果用户量大,在认证这个点上容易形成瓶颈,是应用不易拓展。

JWT原理

JWT由三个部分组成,用点号分割,看起来像是这样,JWT token本身没有空格换行等,下面是为了美观处理了下

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19.
m0HD1SUd30TWKuDQImwjIl9a-oWJreG7tKVzuGVh7e4
1.头部(Header)

Header部分是一个json,描述JWT的元数据,通常是下面这样

{
 "alg": "HS256",
 "typ": "JWT"
}

alg表示签名使用的的算法,默认是HMAC SHA256,写成HS256, tye表示这个token的类型,JWT token统一使用JWT,上面这段Header生成的token是

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2.负载(Payload)

官方规定了7个字段,解释如下

  • iss: 签发人,可以填写生成这个token的ID等等,可选参数
  • sub: 该JWT所面向的客户,可以存储用户的account_id等等,可选
  • aud:该JWTtoken的接收方,可以填写生成这个token的接口URL,但是不强制,可选
  • exp: 过期时间,时间戳,整数,可选参数
  • iat:生成token的时间,unix时间,时间戳,可选参数
  • nbf(Not Before): 表示该token在此时间前不可用,验证不通过的意思,可选
  • jti: JWT ID,主要用来生成一次性token,可选的参数
  • 除了官方之外,我们还可以定义一部分自定义字段,但是考虑到BASE64是可逆的,所以不要放入敏感信息
    下面是一个例子;

    {
     "iss": "labs_purifier-api-panel",
     "iat": 1552975878,
     "exp": 1555567878,
     "aud": "http://ff-labs_purifier-api-test.fenda.io/prod/v1/auth/jwt",
     "sub": "1501385611884704",
     "scopes": [
     "register",
     "open",
     "login",
     "panel"
     ]
    }

    上面这个Payload,经过BASE64加密后,生成的token是

    eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19
    3.签名(Signature)

    Signature是对前面两部分生成的两段token的加密,使用的加密方式是Header里面指定的,此处是HS256,此时,需要一个秘钥,不可以泄露,大致过程如下:

    HMACSHA256(
     base64UrlEncode(header) + "." +
     base64UrlEncode(payload),
     secret)

    JWT的使用

    JWT token 一般放在请求头里面,当然也可以放在cookie里面,但是放在cookie里面不可以跨域,例如:

    Authorization: Bearer <token>

    JWT在Python中的简单生成和验证

    jwt库

    生成token

    def create_token():
     payload={
      "iss": "labs_purifier-api-panel",
      "iat": 1552975878,
      "exp": 1555567878,
      "aud": Config.AUDIENCE,
      "sub": "1501385611884704",
      "scopes": [
      "register",
      "open",
      "login",
      "panel"
      ]
      }
     token = jwt.encode(payload, Config.SECRET_KEY, algorithm='HS256')
     return True, {'access_token': token}

    验证token

    def verify_jwt_token(token):
     try:
     payload = jwt.decode(token, Config.SECRET_KEY,
        audience=Config.AUDIENCE,
        algorithms=['HS256'])
     except (ExpiredSignatureError, DecodeError):
     return False, token
     if payload:
     return True, jwt_model

    需要注意的是,如果在生成的时候,加上了aud参数,验证的时候也要用上audience参数,并且值必须一样

    本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的python视频教程栏目!

    热心网友 时间:2022-04-18 14:30

    用户发起登录请求,服务端创建一个加密后的jwt信息,作为token返回值,在后续请求中jwt信息作为请求头,服务端正确解密后可获取到存储的用户信息,表示验证通过;解密失败说明token无效或者已过期。
    加密后jwt信息如下所示,是由.分割的三部分组成,分别为Header、Payload、Signature。
    eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJqd3QiLCJpYXQiOjE0NzEyNzYyNTEsInN1YiI6IntcInVzZXJJZFwiOjEsXCJyb2xlSWRcIjoxfSIsImV4cCI6MTQ3MTMxOTQ1MX0.vW-pPSl5bU4dmORMa7UzPjBR0F6sqg3n3hQuKY8j35o

    Header包含两部分信息,alg指加密类型,可选值为HS256、RSA等等,typ=JWT为固定值,表示token的类型。
    {
    "alg": "HS256",
    "typ": "JWT"
    }

    Payload是指签名信息以及内容,一般包括iss (发行者), exp (过期时间), sub(用户信息), aud (接收者),以及其他信息,详细介绍请参考官网。
    {
    "sub": "1234567890",
    "name": "John Doe",
    "admin": true
    }

    Signature则为对Header、Payload的签名。
    HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

    在jwt官网,可以看到有不同语言的实现版本,这里使用的是Java版的jjwt。话不多说,直接看代码,加解密都很简单:
    /**
    * 创建 jwt
    * @param id
    * @param subject
    * @param ttlMillis
    * @return
    * @throws Exception
    */
    public String createJWT(String id, String subject, long ttlMillis) throws Exception {
    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256 ;
    long nowMillis = System. currentTimeMillis();
    Date now = new Date( nowMillis);
    SecretKey key = generalKey();
    JwtBuilder builder = Jwts. builder()
    .setId(id)
    .setIssuedAt(now)
    .setSubject(subject)
    .signWith(signatureAlgorithm, key);
    if (ttlMillis >= 0){
    long expMillis = nowMillis + ttlMillis;
    Date exp = new Date( expMillis);
    builder.setExpiration( exp);
    }
    return builder.compact();
    }

    /**
    * 解密 jwt
    * @param jwt
    * @return
    * @throws Exception
    */
    public Claims parseJWT(String jwt) throws Exception{
    SecretKey key = generalKey();
    Claims claims = Jwts. parser()
    .setSigningKey( key)
    .parseClaimsJws( jwt).getBody();
    return claims;
    }

    加解密的key是通过固定字符串转换而生成的;subject为用户信息的json字符串;ttlMillis是指token的有效期,时间较短,需要定时更新。
    这里要介绍的token刷新方式,是在生成token的同时生成一个有效期较长的refreshToken,后续由客户端定时根据refreshToken来获取最新的token。浏览器与服务端之间建立sse(server send event)请求,来实现刷新。关于sse在前面博文中有介绍过,此处略过不提。

    热心网友 时间:2022-04-18 15:48

    passport只是一个用来验证的库,而jwt是一种规范。
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    如果银行拒贷有哪些办法 小天鹅滚筒洗衣机水位多少合适 阴阳师百闻牌攻略大全 百闻牌式神卡组阵容大全 阴阳师百闻牌三大妖狐阵容推荐 妖狐流派怎么搭配?-新手攻略-安族网... 阴阳师百闻牌妖狐快攻阵容 怎么搭配攻略推荐 阴阳师百闻牌妖狐技能攻略 妖狐属性及卡组搭配推荐-新手攻略-安族网... 阴阳师百闻牌妖狐最强卡组 阵容怎么搭配攻略 阴阳师百闻牌妖狐卡组推荐 怎么搭配攻略分享 带鹏字的公司名字大全 鹏字开头公司起名 叶罗丽娃娃玩具店在哪 node.js实现jwt登录权限怎么在有效期内请求延迟过期时间 发现老公的微信和别的女人有聊天,很亲密,还有发给他的红包记录,他们之间有事吗? 我发现我老公微信跟别的女人聊,要娶她之类的话,老公说只是瞎聊的,我改相信吗 发现老公有微信和别的女的聊天见面有一年多怎么办? 男友在微信上和别的女的说一些暧昧的话这样能原谅么? 老公跟女同事微信暧昧聊天,我该如何处理?跪求处理办法!!! 结婚八年,老公与别的女人微信暧昧聊天,这种情况该怎么办? 结婚八年,老公与别的女人微信暧昧聊天,这时候应该怎么办? 老公喜欢和别的女人在微信上聊天,该如何解决这个问题? 我老公在微信经常和一个女的聊天,我发现以后他说没什么的,只不过说说话,一个? 2021大学英语六级下半年报名时间是什么时候? 六级考试2021时间 2021下半年六级考试报名时间什么时候? 2021四六级口语时间是什么? 2021下半年六级考试报名时间是什么时候? 九阳DJ15B-c211sg豆浆机电机如何更换 2021年下半年英语六级考试报名时间是什么时候? 家用婓卡啵牌豆浆机怎么拆开 请问大家豆浆机里用的是什么电机,可以拆下来用在电钻上吗? 2021年上半年六级什么时候考? jwt有什么用 怎么用java或者js操作游览器上保存的用户名密码,实现自动登录的功能_百 ... 怎样写字才能漂亮 jwt需要存redis吗 json web token 可以用于app么 怎么样才能写字漂亮 怎样练字有效 如何查看macbook的生产日期?购买日期?序列号是C02G8B3EDJWT 写字时要如果正确的握笔才能把字写得飘逸端正呢? 苹果园查序列号F18JWT9GDTWD怎么和别的iphone5外表不一样 怎么写字更漂亮? 哪位大大帮查下iphone4 序列号 dx3jwtnhdp0n 详细点的 谢谢 急急急急急急急 如何写字漂亮 最近买了台mac 序列号是C02HF1J7DJWT 哪位好心的人士帮我查下是不是国行呢?非常感谢哦! 怎样写字才会漂亮 程序员应该如何设计更优雅的Token认证方式? 用笔在纸上写字的时候,请问怎么写字才漂亮些 帮忙查询苹果笔记本air信息,如产地,激活日期,生产日期,保修期等,序列号C02HPCQDDJWT,谢谢了 怎样写字才比较漂亮 刚买的苹果5谁能帮忙看看 在不在保和什么时候激活的?我总感觉是提前激活的。另外还有要注意de ? 怎样写字才能写得漂亮