网站建设面试常见问题,媒体发稿,如何用快站做pc端网站,网站建设实训总结范文JWT#xff1a; JSON Web Token
1. jwt概述 用户登录成功后#xff0c;服务端 如何知道客户端的每次请求对应的是哪个用户呢#xff1f;怎么做#xff1a;目前有两种方式实现.
1.1. 一是通过sessionId的方式#xff0c;登录成功后服务端返回sessionId给客户端#xff0…JWT JSON Web Token
1. jwt概述 用户登录成功后服务端 如何知道客户端的每次请求对应的是哪个用户呢怎么做目前有两种方式实现.
1.1. 一是通过sessionId的方式登录成功后服务端返回sessionId给客户端然后浏览器将sessionId保存在Cookie中这样每次浏览器请求的时候都带上sessionId通过sessionId就能在服务端找到对应的session就能知道是哪个用户。 session里记录了用户的相关信息登录时间等 1.2. 二是用户登录成功后服务端根本就不存用户的session信息用户登录成功后服务端将用户的信息返回给客户端客户端自己保存用户信息然后每次客户端请求的时候将用户信息传给服务端这就是jwt的原理。 2. JWT 的原理
JWT 的原理是服务器认证以后生成一个 JSON 对象发回给用户就像下面这样。 {name: jack,role: admin,id: 123456
}以后用户与服务端通信的时候都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据服务器在生成这个对象的时候会加上签名详见后文。
服务器就不保存任何 session 数据了也就是说服务器变成无状态了从而比较容易实现扩展。 3. jwt数据结构
jwt是一个很长的字符串中间用点.分隔成三个部分。注意JWT 内部是没有换行的这里只是为了便于展示将它写成了几行。
JWT 的三个部分依次如下。 Header头部Payload负载Signature签名 类似这样的 3.1 Header
Header 部分是一个 JSON 对象描述 JWT 的元数据通常是下面的样子。 {alg: HS256,typ: JWT
}上面代码中alg属性表示签名的算法algorithm默认是 HMAC SHA256写成 HS256typ属性表示这个令牌token的类型typeJWT 令牌统一写为JWT。
最后将上面的 JSON 对象使用 Base64URL 算法详见后文转成字符串。 3.2 Payload
Payload 部分也是一个 JSON 对象用来存放实际需要传递的数据。JWT 规定了7个官方字段供选用。 iss (issuer)签发人exp (expiration time)过期时间sub (subject)主题aud (audience)受众nbf (Not Before)生效时间iat (Issued At)签发时间jti (JWT ID)编号 除了官方字段你还可以在这个部分定义私有字段下面就是一个例子。 {sub: 1234567890,username: John Doe,userId: 123654
}注意JWT 默认是不加密的任何人都可以读到所以不要把秘密信息放在这个部分。
这个 JSON 对象也要使用 Base64URL 算法转成字符串。
3.3 Signature
Signature 部分是对前两部分的签名防止数据篡改。
首先需要指定一个密钥secret。这个密钥只有服务器才知道不能泄露给用户。然后使用 Header 里面指定的签名算法默认是 HMAC SHA256按照下面的公式产生签名。 HMACSHA256(base64UrlEncode(header) . base64UrlEncode(payload),secret)算出签名以后把 Header、Payload、Signature 三个部分拼成一个字符串每个部分之间用点.分隔就可以返回给用户。
3.4 Base64URL
前面提到Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似但有一些小的不同。
JWT 作为一个令牌token有些场合可能会放到 URL比如 api.example.com/?tokenxxx。Base64 有三个字符、/和在 URL 里面有特殊含义所以要被替换掉被省略、替换成-/替换成_ 。这就是 Base64URL 算法。 4、 使用 jwt 客户端收到服务器返回的 JWT可以储存在 Cookie 里面也可以储存在 localStorage。
此后客户端每次与服务器通信都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送但是这样不能跨域所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。
类似这样这些数据传输
Authorization: Bearer token 5、 自定义实现jwt
说了这么多结下来我们自己来实现定义一个jwt数据的生成jwt数据的解码工作通过目前市面上开源的java-jwt jar包还是很方便的 import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.gfm.asset.base.exception.InteractException;
import lombok.SneakyThrows;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** author xxx */
public class JwtHelper {private static final Logger logger LoggerFactory.getLogger(JwtHelper.class);/*** 密钥加密token*/SneakyThrowspublic static String generateToken(String userKey, String secretKey, int expire) {Algorithm algorithm Algorithm.HMAC256(secretKey);String token JWT.create().withIssuer(userKey).withIssuedAt(new Date()).withExpiresAt(DateTime.now().plusSeconds(expire).toDate()).sign(algorithm);logger.info( 生成jwtToken, userKey{},secretKey{},过期时间{}s,token{}, userKey, secretKey, expire, token);return token;}/*** 公钥解析token*/public static String parserToken(String token, String secretKey) {try {Algorithm algorithm Algorithm.HMAC256(secretKey);DecodedJWT jwt JWT.require(algorithm).build().verify(token);return jwt.getIssuer();} catch (TokenExpiredException e) {throw new InteractException(token has expired);} catch (Exception e) {e.printStackTrace();throw new InteractException(token is invalid);}}public static void main(String[] args) { String userKey center_sys;String secretKey center_sys#$;String token generateToken(userKey, secretKey, 60 * 60 * 24 * 7);System.out.println(token);
// String key parserToken(token, secretKey);
// System.out.println(key);}} pom.xml文件 dependencygroupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion3.19.1/versionexclusionsexclusiongroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/exclusion/exclusions/dependency 参考
JSON Web Token 入门教程 - 阮一峰的网络日志