APP用户登录解决方案——JWT(json web token)生成Token

news/2024/7/3 13:52:14 标签: 用户登录解决方案, JWT, json web token, Token

什么是JSON Web Token

JSON Web TokenJWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象安全传输信息。这些信息可以通过数字签名进行验证和信任。可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对对JWT进行签名。

为什么使用JWT

随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单。

JWT的优点:

  • 体积小,因而传输速度更快
  • 多样化的传输方式,可以通过URL传输、POST传输、请求头Header传输(常用)
  • 简单方便,服务端拿到jwt后无需再次查询数据库校验token可用性,也无需进行redis缓存校验
  • 在分布式系统中,很好地解决了单点登录问题
  • 很方便的解决了跨域授权问题,因为跨域无法共享cookie

JWT的缺点:

  • 因为JWT是无状态的,因此服务端无法控制已经生成的Token失效,是不可控的,这一点对于是否使用jwt是需要重点考量的
  • 获取到jwt也就拥有了登录权限,因此jwt是不可泄露的,网站最好使用https,防止中间攻击偷取jwt
  • 在退出登录 / 修改密码时怎样实现JWT Token失效https://segmentfault.com/q/1010000010043871

对于JWT安全性:

JWT被确实存在被窃取的问题,但是如果能得到别人的token,其实也就相当于能窃取别人的密码,这其实已经不是JWT安全性的问题。网络是存在多种不安全性的,对于传统的session登录的方式,如果别人能窃取登录后的sessionID,也就能模拟登录状态,这和JWT是类似的。为了安全,https加密非常有必要,对于JWT有效时间最好设置短一点。

使用JWT部分后端代码:

maven依赖:

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

Java代码:

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.druid.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;

/**
 * APP登录Token的生成和解析
 * 
 */
public class JwtToken {

	/** token秘钥,请勿泄露,请勿随便修改 backups:JKKLJOoasdlfj */
	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
	 *            登录成功后用户user_id, 参数user_id不可传空
	 */
	public static String createToken(Long user_id) 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<>();
		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())
				.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());
	}
}

http://www.niftyadmin.cn/n/1870566.html

相关文章

基于JWT前后端token认证

JWT简介 JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息&#xff0c;以便于从资源服务器获取资源。比如用在用户登录上。 基于session的登录认证 在传统的用户登…

C,C++,Python三种语言实现斐波拉契数列

斐波拉契数列专题斐波拉契数列介绍输出一定范围的斐波拉契数列C实现C实现python实现输出小于某个数的斐波拉契数列C实现C实现python实现斐波拉契数列介绍 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列、因数学家莱昂纳多斐波那契&…

Python爬虫实战之12306抢票

12306抢票前言一、爬虫是什么&#xff1f;二、使用步骤1.引入库2.爬虫代码3.城市编码4.主程序总结前言 提示&#xff1a;用python实现简单的12306余票查询 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、爬虫是什么&#xff1f; 爬虫一般指网络爬…

Spring Security 与 Oauth2 整合 步骤

spring-security-oauth2的项目地址为 https://github.com/spring-projects/spring-security-oauth/tree/master/spring-security-oauth2 spring-security-oauth2的demo 地址为 https://github.com/spring-projects/spring-security-oauth/tree/master/samples/oauth2 为什么要…

python数据分析( 一)

python数据分析 第一篇&#xff1a;Python 数据分析入门之python的安装 Python介绍python数据分析前言一、Python简介二、Python安装与使用1.推荐使用Anaconda2.推荐使用jupyter lab三、Python数据分析包简介总结前言 作者&#xff1a;Guido Van Rossum (GvR) http://www.pyt…

C,C++,Python解决猴子吃桃问题

文章目录1. 题目2.C语言实现&#xff1a;3.C实现&#xff1a;4.python实现&#xff1a;1. 题目 先看看题目&#xff1a; 猴子吃桃问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;然后还是忍不住&#xff0c;又多吃了一个&#xff0c;第二天早上…

Spring security oauth2最简单入门环境搭建--二、干货

关于OAuth2的一些简介&#xff0c;见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS&#xff1a;貌似内容太水直接被鹳狸猿干沉。。 友情提示 学习曲线&#xff1a;springspring mvcspring securityOauth2基本姿势,如果前面都没看过请及时关闭本网页。 我有信心我的…

python开发案例:基于Pygame的贪吃蛇小游戏

python实现贪吃蛇小游戏&#xff0c;贪吃蛇大家基本都非常清楚吧&#xff0c;Pygame 是一组用来开发游戏软件的 Python 程序模块&#xff0c;基于 SDL 库的基础上开发。允许你在 Python 程序中创建功能丰富的游戏和多媒体程序&#xff0c;Pygame 是一个高可移植性的模块可以支持…