赞
踩
目录
3.1JSON Web Token(JWT)是一个非常轻巧的规范 。JWT 标准的 Token 有三个部分:
参考网页
JavaWeb—基于Token的身份验证 - 大象踢足球 - 博客园
HTTP Basic Auth每次请求API时都提供用户的username和password,Basic Auth是配合RESTful API 使用的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此,在开发对外开放的RESTful API时,尽量避免采用HTTP Basic Auth。
Cookie认证为一次请求认证在服务端创建一个Session对象,同时在客户端的浏览器端创建了一个Cookie对象;通过客户端带上来Cookie对象来与服务器端的session对象匹配来实现状态管理的。默认的,当我们关闭浏览器的时候,cookie会被删除。但可以通过修改cookie 的expire time使cookie在一定时间内有效。
客户端使用用户名跟密码请求登录
服务端收到请求,去验证用户名与密码
验证成功后,服务端会签发一个 Token然后保存(缓存或者数据库),再把这个 Token 发送给客户端
客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
唯一在头部里面要包含的是 alg 这个属性、其他的都是一些加密信息
{
"alg": "HS256"
}
Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。
- 标准信息模板
- iss:Issuer,发行者
- sub:Subject,主题
- aud:Audience,观众
- exp:Expiration time,过期时间
- nbf:Not before
- iat:Issued at,发行时间
- jti:JWT ID
这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。
JJWT实现了JWT, JWS, JWE 和 JWA RFC规范
- #JJWT依赖
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt</artifactId>
- <version>版本</version>
- </dependency>
- /**
- * 解析JWT
- * @param jsonWebToken
- * @param base64Security
- * @return
- */
- public static Claims parseJWT(String jsonWebToken, String base64Security) {
- try {
- Claims claims = Jwts.parser()
- .setSigningKey(DatatypeConverter.parseBase64Binary(base64Security))
- .parseClaimsJws(jsonWebToken).getBody();
- return claims;
- } catch (Exception ex) {
- return null;
- }
- }
-
- /**
- * 创建JWT
- * @param no
- * @param userId
- * @param issuer
- * @param TTLMillis
- * @param base64Security
- * @return
- */
- public static String createJWT(String no, String userId,
- String issuer, long TTLMillis, String base64Security) {
- SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
- long nowMillis = System.currentTimeMillis();
- Date now = new Date(nowMillis);
- //生成签名密钥
- byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(base64Security);
- Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
- //添加构成JWT的参数
- JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT")
- .claim("no", no)
- .setSubject(userId)
- .setIssuer(issuer)
- .signWith(signatureAlgorithm, signingKey);
- //添加Token过期时间
- if (TTLMillis >= 0) {
- long expMillis = nowMillis + TTLMillis;
- Date exp = new Date(expMillis);
- builder.setExpiration(exp).setNotBefore(now);
- }
- //生成JWT
- return builder.compact();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。