概念:

JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。

优点是在分布式系统中,很好地解决了单点登录问题,很容易解决了session共享的问题。
缺点是无法作废已颁布的令牌/不易应对数据过期。

JWT 只是一种规范,具体应用,还是需要开发人员自己实现取数据的过程。

一般实现过程是这样的:

1.用户登陆后生成jwt token。

2.以后每次客户端访问在请求头或者cookie 中带上此cookie。

3.服务端接收此token后,获取用户信息,获取用户上下文数据,用户编写代码获取自己相关的数据。

JWT生成代码实现:

1.编辑POM.xml文件,加入下面的片段

<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>

2.JWT生成和解析过程。

package com.neo.util;

import java.util.Base64;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; import org.springframework.util.StringUtils; import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT; public class JwtUtil { /**
* 加密的密码,这个密码不能对外面泄漏。
*/
public static final String SECRET = "JKKLJOoasdlfj";
/** token 过期时间: 10天 */
public static final int calendarField = Calendar.DATE;
public static final int calendarInterval = 10; /**
* JWT生成Token.<br/>
*
* JWT构成: header, payload, signature
*
* @param user_id 用户ID
* @param name 用户名称
*
* 这些参数可以扩展的注意不要放入敏感信息,比如密码。
*
*/
public static String createToken(Long user_id,String name) throws Exception {
Date iatDate = new Date();
// expire time
Calendar nowTime = Calendar.getInstance();
nowTime.add(calendarField, calendarInterval);
Date expiresDate = nowTime.getTime(); // header Map
Map<String, Object> map = new HashMap<String, Object>();
map.put("alg", "HS256");
map.put("typ", "JWT"); // build token
// param backups {iss:Service, aud:APP}
String token = JWT.create().withHeader(map) // header
.withClaim("iss", "Service") // payload
.withClaim("aud", "APP")
.withClaim("user_id", null == user_id ? null : user_id.toString())
.withClaim("name", name)
.withIssuedAt(iatDate) // sign time
.withExpiresAt(expiresDate) // expire time
.sign(Algorithm.HMAC256(SECRET)); // signature return token;
} /**
* 解密Token
*
* @param token
* @return
* @throws Exception
*/
public static Map<String, Claim> verifyToken(String token) {
DecodedJWT jwt = null;
try {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
jwt = verifier.verify(token);
} catch (Exception e) {
// e.printStackTrace();
// token 校验失败, 抛出Token验证非法异常
}
return jwt.getClaims();
} /**
* 根据Token获取user_id
*
* @param token
* @return user_id
*/
public static Long getAppUID(String token) {
Map<String, Claim> claims = verifyToken(token);
Claim user_id_claim = claims.get("user_id");
if (null == user_id_claim || StringUtils.isEmpty(user_id_claim.asString())) {
// token 校验失败, 抛出Token验证非法异常
}
return Long.valueOf(user_id_claim.asString());
} public static void main(String[] args) throws Exception {
String token=createToken(9999L,"ray");
System.out.println(token);
Long uid=getAppUID(token);
Map<String, Claim> claims = verifyToken(token);
System.out.println(claims.get("name").asString());
//eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJBUFAiLCJ1c2VyX2lkIjoiOTk5OSIsImlzcyI6IlNlcnZpY2UiLCJuYW1lIjoiemhhbmd5ZyIsImV4cCI6MTU0MTk0NzA4MSwiaWF0IjoxNTQxMDgzMDgxfQ.fUc0PSjdvR5ihHUv8hk7eQeUlv5RkmrsCZxq6bUXYDc byte[] bytes= Base64.getUrlDecoder().decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9");
System.out.println(new String(bytes)); bytes= Base64.getUrlDecoder().decode("eyJhdWQiOiJBUFAiLCJ1c2VyX2lkIjoiOTk5OSIsImlzcyI6IlNlcnZpY2UiLCJuYW1lIjoiemhhbmd5ZyIsImV4cCI6MTU0MTk0NzA4MSwiaWF0IjoxNTQxMDgzMDgxfQ");
System.out.println(new String(bytes));
} }

需要注意的是,我们可以在token放入用户ID,用户名称等信息,不要放入权限密码等信息,因为TOKEN 会在有效期内不发生变化,另外头部和payload信息是base64编码,是可以被解码的。

JWT 理解的更多相关文章

  1. Django之JWT理解及简单应用

    Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(S ...

  2. 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  3. 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  4. 看图理解JWT如何用于单点登录

    单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...

  5. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本 ...

  6. jwt再度理解

    1,负载部分只用base64编码,是可逆的,不能存放密码 2,加密算法不在乎是对称还是非对称,因为jwt的验签不需要解密 3,一般的验签是用私钥加密签名,公钥验签,和加密反过来,加密是公钥加密,服务器 ...

  7. 理解JWT(Json Web Token)

    这篇文章写得不错: 理解JWT(JSON Web Token)认证及python实践,这里不做转载,仅摘要如下,有删改,仅做个人学习,感谢原作者. 常用认证机制: 1)HTTP basic Auth: ...

  8. 理解JWT(JSON Web Token)认证及python实践

    原文:https://segmentfault.com/a/1190000010312468?utm_source=tag-newest 几种常用的认证机制 HTTP Basic Auth HTTP ...

  9. JWT—JSON Web Token - 理解JWT网络间应用用户安全认证交互设计

    原文地址:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ 官网地址:https://jwt.io/ JSON Web Token(JW ...

随机推荐

  1. TypeScript之定义类型 ( type )

    键值对结构的对象 export type ValidationErrors = { [key: string]: any }; 联合类型(union type) export type HttpEve ...

  2. java 编解码

    decoder:解码--> 将文件内容转换为字符对象: encoder:编码-->将字符对象转换为字节或者字节数组: ASCII  (American Standard for Infor ...

  3. URL编码表、Base64编码表、HTTP消息含义

    URL编码表 backspace 8% A 41% a 61% § %A7 Õ %D5 tab 9% B 42% b 62% « %AB Ö %D6 linefeed %0A C 43% c 63% ...

  4. FTPserver

    客户端代码: import os import hashlib BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__) ...

  5. BCH/BCHABC/BCHSV分叉后重放机制小结

    1. 不过,在谈重放保护之前,我们需要先了解一下重放攻击(又称重播攻击.回放攻击).实际上,重放攻击在互联网行业里就有过出现,也是计算机世界黑客最常用的攻击方式之一,它是指攻击者发送一个目的主机已接收 ...

  6. C# 获取 存储过程 返回值

    C#获取存储过程的返回值,这一方法,总是容易忘,今天给贴出来,以方便下次使用 存储过程: CREATE  PROCEDURE [dbo].[Proc_GetInfo]     ),     ) out ...

  7. PAT 1001 害死人不偿命的(3n+1)猜想 (15)(C++&JAVA&Python)

    1001 害死人不偿命的(3n+1)猜想 (15)(15 分) 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反 ...

  8. django POST表单的使用

    环境如下:django 1.7.8 版本. 1.在POST表单的时候会出现这个错误提示. 禁止访问 (403) CSRF验证失败. 相应中断. Help Reason given for failur ...

  9. Nginx 如何设置反向代理

    网络结构如上图.可能你只有一个公网的Ip地址. 但是您的内网有个网站需要映射至外网.而又不想添加其它的非80端口.则你可以直接使用nginx来做反向代理即可.首先,配置nginx.conf文件. ht ...

  10. csdn博客

    https://blog.csdn.net/lydstory123?t=1 以前还有几篇文章  忘记了