首页 > 作文

Java JWT实现跨域身份验证方法详解

更新时间:2023-04-04 11:09:09 阅读: 评论:0

目录
1、jwt简介2、jwt的结构2.1 头部(header)2.2 载荷(payload)2.3 签证(signature)3、jwt的原则4、jwt的用法5、jwt的问题和趋势6、整合jwt令牌6.1 在模块中添加jwt工具依赖6.2 创建jwt工具类

1、jwt简介

jwt(json web token)是目前流行的跨域认证解决方案,是一个开放标准(rfc 7519),它定义了一种紧凑的、自包含的方式,用于作为json对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

2、jwt的结构

jwt是由头部(header)、载荷(payload)、签证(signature)三段信息构成的,将三段信息文本用”.”连接在一起就构成了jwt字符串。

例如:

eyjhbgcioijiuzi1niisinr5cci6ikpxv普通话小报cj9.

eyjzdwiioiixmjm0nty3odkwiiwibmftzsi6ikpvag4grg9liiwiawf0ijoxnte2mjm5mdiyfq.

sflkxwrjsmekkf2qt4fwpmejf36pok6yjv_adqssw5c

使用在线校验工具(https://jwt.io/)将上述token进行解码就可以看到数据,如下图所示

2.1 头部(header)

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

(1)声f1比赛时间明类型:这里主要是jwt。

(2)声明加密算法:通常直接使用hmac sha256。

例如:

{  "alg": "hs256",  "typ": "jwt"}

alg属性表示签名所使用的算法;

jwt签名默认的算法为hmac sha256;

alg属性值hs256就是hmac sha256算法;

type属性表示令牌类型,这里是jwt。

2.2 载荷(payload)

载荷是jwt的主体,同样也是一个json对象。载荷包含三个部分:

(1)标准中的声明(registered claims):一组预定义的声明,不是强制的,但是推荐。

iss(issuer):jwt签发者sub(subject):jwt索所面向的用户aud(audience):接收jwt的一方exp(expiration):jwt的过期时间,必须要大于签发时间。nbf(not before):定义了再什么时间之前该jwt都是不可用的。iat(i孩子抚养权ssued at):jwt的发布时间,unix时间戳。jti(jwt id):jwt的唯一id编号。

(2)公共的声明:可以添加任意信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息。

(3)私有的声明:提供者和消费者所共同定义的声明,一般不建议存放敏感信息。

2.3 签证(signature)什么是密度

jwt的第三部分是一个签证信息,由三部分组成:header(ba64后的)、payload(ba64后的)、cret(密钥,需要保存好)。

例如:

hmacsha256(ba64urlencode(header)+"."+ba64urlencode(payload),cret)

签名用于验证消息再传递过程中有没有被更改,并且对于使用私钥签名的token还可以验证jwt的发送方是否为它所说的发送方。

cret是保存在服务端的,jwt的签发生成也是在服务端的,cret就是用来进行jwt的签发和验证的,所以cret是服务端的私钥,在任何场景都不应该流露出去。

3、jwt的原则

jwt的原则是在服务器身份验证之后,将生成一个json对象并将其发送回用户,如下所示。

{  "sub": "1234567890",  "name": "helen",  "admin": true}

之后,当用户与服务器通信时,客户在请求中发回json对象。服务器仅依赖于这个json对象来标识用户。为了防止用户篡改数据,服务器将在生成对象时添加签名。

服务器不保存任何会话数据,即服务器变为无状态,使其更容易扩展。

4、jwt的用法

客户端接收服务器返回的jwt,将其存储在cookie或localstorage中。

此后,客户端将在与服务器交互中都会带jwt。如果将它存储在cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入http请求的header authorization字段中。当跨域时,也可以将jwt被放置于post请求的数据主体中。

5、jwt的问题和趋势

jwt不仅可用于认证,还可用于信息交换。善用jwt有助于减少服务器请求数据库的次数。

生产的token可以包含基本信息,比如id、用户昵称、头像等信息,避免再次查库

存储在客户端,不占用服务端的内存资源

jwt默认不加密,但可以加密。生成原始令牌后,可以再次对其进行加密。

当jwt未加密时,一些私密数据无法通过jwt传输。

jwt的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦jwt签发,在有效期内将会一直有效。

jwt本身包含认证信息,token是经过ba64编码,所以可以解码,因此token加密前的对象不应该包含敏感信息,一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,jwt的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证。

为了减少盗用和窃取,jwt不建议使用http协议来传输代码,而是使用加密的https协议进行传输。

6、整合jwt令牌

6.1 在模块中添加jwt工具依赖

<dependencies>    <!-- jwt-->    <dependency>        <groupid>io.jsonwebtoken</groupid>        <artifactid>jjwt</artifactid>    </dependency></dependencies>

6.2 创建jwt工具类

/** * jwt工具类 */public class jwthelper {    //过期时间    private static long tokenexpiration = 24*60*60*1000;    //token签名密钥    private static string tokensignkey = "123456";    //根据参数生成token    public static string createtoken(long uqq共同好友怎么看rid, string urname) {        string token = jwts.builder()                .tsubject("yygh-ur")                //设置过期时间 30分钟                .texpiration(new date(system.currenttimemillis() + tokenexpiration))                //设置主题信息  用户id和用户名称                .claim("urid", urid)                .claim("urname", urname)                //签名哈希                .signwith(signaturealgorithm.hs512, tokensignkey)                .compresswith(compressioncodecs.gzip)                .compact();        return token;    }    //根据token字符串得到用户id    public static long geturid(string token) {        if(stringutils.impty(token)) return null;        jws<claims> claimsjws = jwts.parr().tsigningkey(tokensignkey).parclaimsjws(token);        claims claims = claimsjws.getbody();        integer urid = (integer)claims.get("urid");        return urid.longvalue();    }    //根据token字符串得到用户名称    public static string geturname(string token) {        if(stringutils.impty(token)) return "";        jws<claims> claimsjws             = jwts.parr().tsigningkey(tokensignkey).parclaimsjws(token);        claims claims = claimsjws.getbody();        return (string)claims.get("urname");    }   }

写个主函数测试下:

public static void main(string[] args) {        string token = jwthelper.createtoken(1l, "lucy");        system.out.println(token);        system.out.println(jwthelper.geturid(token));        system.out.println(jwthelper.geturname(token));    }

签发和解析都没问题。

到此这篇关于java jwt实现跨域身份验证方法详解的文章就介绍到这了,更多相关jwt跨域身份验证内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 11:09:06,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/bba03c4a90f583da2be90ce59994a8d2.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Java JWT实现跨域身份验证方法详解.doc

本文 PDF 下载地址:Java JWT实现跨域身份验证方法详解.pdf

标签:令牌   信息   用户   服务器
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图