package com.example.demo.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.apache.commons.lang3.time.DateUtils; import java.util.Date;
import java.util.HashMap;
import java.util.Map; /**
*依赖:
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
*
*
*
*
*/ public abstract class JWTUtil {
/**
* JWT 由3部分组成: header(Map集合),playload(负载,也可以把它看做请求体body,也是一个map集合),signature(签名,有header和playload加密后再跟secrect加密生成)
* header:有2个值,一个是类型,一个是算法,类型就是JWT,不会变,算法有2种选择,HMAC256和RS256,基本选择HMAC256
* playload:类似于post请求的请求体,是一个map集合,可以存很多很多值,如存用户的信息
* signature:由header(Base64加密后)和playload(Base64加密后)再加上secrect(秘钥生成)
* Base64加密是可逆的,所以存在header和playload的数据不能是敏感数据
*
* playload有一些值定义:
*
* iss: jwt签发者 sub: jwt所面向的用户 aud: 接收jwt的一方 exp: jwt的过期时间,这个过期时间必须要大于签发时间 nbf: 定义在什么时间之前,该jwt都是不可用的. iat: jwt的签发时间 jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。 *
* @param userId 用户编号
* @param secrect 秘钥(密码)
* @param expireTime 过期时间单位s
* @return
*/
public static String getToken(String userId,String secrect,int expireTime){
Date createDate = new Date();
Date expireDate = DateUtils.addSeconds(createDate, expireTime);
Map<String, Object> header = new HashMap<>();
header.put("alg", "HS256");
header.put("typ", "JWT");
//token创建底层使用的是设计模式中的创建者模式,了解该模式对于下面的代码比较容易理解
String token = JWT.create().withHeader(header)
.withClaim("userId", userId) //playload的一部分:withClaim底层是一个map,可以不断使用链式表达式存数据
.withIssuedAt(createDate)//创建时间 //playload的一部分
.withExpiresAt(expireDate) //过期时间 //playload的一部分
.sign(Algorithm.HMAC256(secrect));//生成 signature
return token; }
//如果token过期了,解析时就会报错,所以捕捉到异常时就知道是否过期了
public static DecodedJWT decodeToken(String token, String secretKey) {
DecodedJWT jwt = null; try {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secretKey)).build();
jwt = verifier.verify(token);
return jwt;
} catch (JWTVerificationException ex) {
System.out.println("token 过期了");
throw ex;
}
} //也可以通过token不需要密钥直接获取 DecodedJWT
public static DecodedJWT decodedToken(String token){
DecodedJWT decode = JWT.decode(token);
return decode;
//Map<String, Claim> claims = decode.getClaims();
}
//获取payLoad的值
public static Object getUserId(String token,String userId,String secrect){
DecodedJWT decodedJWT = decodeToken(token, secrect);
Map<String, Claim> claims = decodedJWT.getClaims();
Claim claim = claims.get(userId);//也可以通过claims获取其他值,具体根据存到playlaod里面的数据来取值
return claim.asString();
} public static String login(String userName,String password){ User usr=userService.findUserByUserIdAndPassword(userName,password);
if(null==usr){
System.out.println("账号或密码错误");
return null;
} String token = getToken(usr.getUserId,password,86400);//1天过期 token一旦生成,就没法修改,只有到过期时间后,才会失效,所以可以使用redis处理,用户每登录一次,就生成新的token redisUtil.set("login:user:"+usr.getUserId,token,86400);//用户每登录一次就会替换一次
return token; return null;
}
public static boolean checkToken(String userId,String token){
if(null==token){
return false;
} String token2=redisUtil.get("login.user:"+userId);
if(!token.equal(token2)){
return false;
} return true;
} }

使用JWT登录生成token的更多相关文章

  1. 基于JAVA JWT 实现OATUH TOKEN验证

    什么是jwt? 最详细的是官网:https://jwt.io/ 这里以java的ssm框架为例,集成jwt. 1.pom.xml 导入jwt的包 <!-- jwt --> <!-- ...

  2. 实战模拟│JWT 登录认证

    目录 Token 认证流程 Token 认证优点 JWT 结构 JWT 基本使用 实战:使用 JWT 登录认证 Token 认证流程 作为目前最流行的跨域认证解决方案,JWT(JSON Web Tok ...

  3. 国服最强JWT生成Token做登录校验讲解,看完保证你学会!

    转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...

  4. 使用 JWT 生成 Token 代码示例

    JSON Web Token,简称 JWT, 是一个开放的标准(RFC 7519),它定义了以一种紧凑的.自包含的 JSON 对象在各方之间安全传输信息的方式.该信息含有数字签名,可以被验证和信任. ...

  5. node使用JsonWebToken 生成token,完成用户登录、登录检测

    最近在用node做后台的登录,检测登录功能.在本地使用session可以成功,但是放服务器后发现session失效了,每次请求session都会变化,着了很久原因.原来,自己项目是前后端分离的,前端调 ...

  6. jwt认证生成后的token后端解析

    一.首先前端发送token token所在的位置headers {'authorization':token的值',Content-Type':application/json} 在ajax写 //只 ...

  7. jwt认证生成后的token如何传回后端并解析的详解

    jwt认证生成后的token后端解析 一.首先前端发送token token所在的位置headers {'authorization':token的值',Content-Type':applicati ...

  8. JWT生成token及过期处理方案

    业务场景 在前后分离场景下,越来越多的项目使用token作为接口的安全机制,APP端或者WEB端(使用VUE.REACTJS等构建)使用token与后端接口交互,以达到安全的目的.本文结合stacko ...

  9. 利用jwt生成token,用于http请求身份验证

    前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证. 1.利用jwt生成token a.导入jwt相关包 <!-- jwt --> ...

随机推荐

  1. javacv教程文档手册开发指南汇总篇

    本章作为javacv技术栈系列文章汇总 前言 写了不少关于javacv的文章,不敢说精通 ,只能说对javacv很熟悉.虽然偶尔也提交pull request做做贡献,但是javacv包含的库实在太多 ...

  2. 解决Oracle12cr2自创建用户无法登录的问题

    说明: 下面创建是创建CDB本地用户,不是PDB应用程序用户,如果是PDB应用程序创建语法会不一样.下面介绍创建CDB本地用户. 创建表空空间 CREATE TABLESPACE YH datafil ...

  3. 屏幕适配 部分知识点总结,CSDN小冰原创

    /** * 作者:David Zheng on 2015/11/7 15:38 * *  网站:http://www.93sec.cc * *  微博:http://weibo.com/mcxiaob ...

  4. Android开发之 当前日期String类型转date类型 java代码中实现方法

    /** * 获取当前时间 * * @return */ public Date getDate(String str) { try { java.text.SimpleDateFormat forma ...

  5. Java拷贝——深拷贝与浅拷贝

    深拷贝和浅拷贝 值类型 vs 引用类型 在Java中,像数组.类Class.枚举Enum.Integer包装类等等,就是典型的引用类型,所以操作时一般来说采用的也是引用传递的方式: 但是Java的语言 ...

  6. [HGAME Week2] Cosmos的博客后台

    觉得这道题考察的东西比较综合而且比较简单,就写上了.因为写这篇文章的时候环境已经关闭了,所以引用了其他师傅wp的图片 本题考察了:php://filter伪协议文件包含.var_dump()输出GLO ...

  7. SpringMVC实例及注解(二)

    @RequestMapping()除了修饰方法,还可以修饰类1.类定义处:提供初步的请求映射信息.相对于WEB应用的根目录2.方法处:提供进一步的细分映射信息.相对于类定义处的URL.若类定义处未标注 ...

  8. ASP.NET Core 3.x Razor视图运行时刷新实时编译

    前言: 很长一段时间没有写过ASP.NET Core Razor(.cshtml)视图开发WEB页面了,今天刚好把之前做的一个由ASP.NET Core 2.2+Razor开发的项目升级到ASP.NE ...

  9. 跟着兄弟连系统学习Linux-【day04】

    day04-20200601 p15.链接文件 [ln -s 原文件   连接文件]软连接,所有人都可以操作软连接文件(实际上是取决于原文件的权限),类似于Windows的快捷方式,方便进行管理.软连 ...

  10. 设置logback的log文件地址为程序运行的当前目录

    这个需求虽然怪异,却也不是无事生非,在以jar包为执行主体的程序中就会遇到. 设置方法就是指定Log_HOME为./,其在如下配置文件的第四行: <?xml version="1.0& ...