JWT全称JSON Web Token,是一个紧凑的,自包含的,安全的信息交换协议。JWT有很多方面的应用,例如权限认证,信息交换等。本文将简单介绍JWT登录权限认证的一个实例操作。

JWT组成

JWT由头部(Header),负载(Payload)和签名(Signature)三部分组成。其中头部包含了JWT的声明信息,例如签名所用的算法等。

{
"alg": "HS256",
"typ": "JWT"
}

负载部分是负责信息的承载,在通信过程中,我们将要交换的信息放置于负载部分。

{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}

签名部分是JWT安全的保障,在传输过程中,头部和负载部分会经过Base64编码在网络中明文传输,既然是明文,为了保障信息在传输过程中不被篡改。JWT会对编码之后的头部和负载进行一个消息签名。

Signature = HMACSHA256(header + "." + payload + secret)

经过签名之后的JWT保证了数据不会被劫持并篡改。其中secret极为重要,即使有人劫持了消息,在不知道secret的情况下,无法签名出一个有效的JWT。

JWT的形式

JWT由三部分组成:头部,负载和签名。最终的JWT字串可以呈现出这三部分,在JWT中,.为分割各部分的分隔符,按照顺序依次为头部,负载和签名。不过这时你已经看不到JSON的形式,头部和负载会经过Base64编码,最终得到一个字符串。不过Base64并不是加密算法,它是一种编码格式,你可以通过一定的工具解码之后就会得到相应的JSON字串。

JWT实现权限认证

在互联网Web应用开发中,最为常见的一项工作就是认证用户,状态化HTTP请求和授予资源访问权限。

其中认证用户通过用户名、密码的登录操作实现,但是HTTP请求是无状态的,为了标记已经登录成功的用户,我们可以通过设置SESSION_IDCOOKIE来标记认证过的请求。但是它们都需要在服务端额外的存储这些SESSION_IDCOOKIE。在最初的单体应用架构中,存储可以在服务端中开辟一块内存,以键值对的形式存储SESSION_ID,COOKIE与用户的映射关系。分布式架构中可以使用REDIS等中间件来实现SESSION共享。

为什要存储映射关系?通过SESSION_IDCOOKIE我们不能够直接得到用户信息吗?其实并不是不可以,而是不安全,SESSION_IDCOOKIE是可以供用户自由操作的。如果直接明文形式的将用户信息写入其中,那么这些信息极有可能会被篡改。所以通常我们会在服务端生成随机字串,写入到SESSION_IDCOOKIE中,再将随机字串与用户之间建立一个映射。这样,客户端的用户并不能随意篡改这些信息了。因为并不知道其他用户的随机字串是什么。

JWT也是字串,只不过是编码之后的字串,但是这个字串是安全的。因为它是被服务端签名认证的。如果有用户修改的痕迹,那么服务端在检验时会发现字串被修改。正是这一特性保障了认证的安全性。

在业务中,JWT可以实现双向校验,即通信双方都可以校验JWT有无被篡改。实现方式是通过非对称加密技术。

Java-JWT权限认证Demo

登陆成功之后,服务端签发JWT代码:

final long expireTime = 1000 * 60 * 60 * 4; //JWT有效期为一天
final String loginWebToken = JWT.create()
.withIssuer(configurationProperties.getJwtLoginIssuer())
.withClaim("username", vo.getUsername()) // 负载部分
.withClaim("user_id", admin.getId())
.withExpiresAt(new Date(System.currentTimeMillis() + expireTime)) // 设置有效期
.sign(Algorithm.HMAC256(configurationProperties.getJwtSignKey())); // 进行签名

签发的JWT可以直接返回给客户端,有客户端JS代码写入下次请求的指定位置,也可以由服务端写入SESSION_IDCOOKIE中。

校验JWT代码,拦截未认证的请求:

try
{
final String loginWebToken = request.getHeader("Authorization");
// final DecodedJWT decodeToken = JWT.decode(loginWebToken);
// String username = decodeToken.getClaim("username").asString();
// JWT验证
JWT.require(Algorithm.HMAC256(configurationProperties.getJwtSignKey()))
.withIssuer(configurationProperties.getJwtLoginIssuer())
.build().verify(loginWebToken);
return true;
}catch (Exception ex)
{
Response re = new Response()
.setMsg("权限受限,请登陆")
.setData(null)
.setSuccess(false);
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
response.getWriter().print(JSON.toJSONString(re));
return false;
}

业务中使用JWT实现HTTP状态化,服务不同认证用户:

@GetMapping("/user/info")
public Response getUserInfo(HttpServletRequest req)
{
final String loginWebToken = request.getHeader("Authorization");
final DecodedJWT jwt = JWT.decode(loginWebToken);
log.info("欢迎{}使用系统", jwt.getClaim("username");
return userService.getUserInfo(jwt.getClaim("user_id"));
}

JWT实现登录认证实例的更多相关文章

  1. 厉害!我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证!

    小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来! 小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么 ...

  2. 【项目实践】一文带你搞定Session和JWT的登录认证方式

    以项目驱动学习,以实践检验真知 前言 登录认证,估计是所有系统中最常见的功能了,并且也是最基础.最重要的功能.为了做好这一块而诞生了许多安全框架,比如最常见的Shiro.Spring Security ...

  3. .net core 2.1 基于Jwt的登录认证

    1.新建一个.net core2.1 基于 api 的工程,引用Microsoft.AspNetCore.Authentication.JwtBearer 包 2.新建一个Token的实体类,一个Jw ...

  4. springboot+jwt完成登录认证

    本demo用于测试jwt,通过登录验证通过后,使用jwt生成token,然后在请求header中携带token完成访问用户列表信息. 准备工作: 1. 实体类SysUser.java package ...

  5. AntDesign Pro + .NET Core 实现基于JWT的登录认证

    很多同学说AgileConfig的UI实在是太丑了.我想想也是的,本来这个项目是我自己使用的,一开始甚至连UI都没有,全靠手动在数据库里修改数据.后来加上了UI也是使用了老掉牙的bootstrap3做 ...

  6. SpringBoot整合JWT实现登录认证

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

  7. 全栈项目|小书架|服务器开发-NodeJS 使用 JWT 实现登录认证

    通过这篇 全栈项目|小书架|服务器开发-JWT 详解 文章我们对JWT有了深入的了解,那么接下来介绍JWT如何在项目中使用. 安装 $ npm install jsonwebtoken 生成 Toke ...

  8. 基于jwt的用户登录认证

    最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...

  9. Luffy之登录认证以及JWT

    1.用户认证 在前面我们已经完成了,前端登录页面的搭建,以及路由分配,现在我们作关于登录认证部分的东西 Django提供了认证系统.认证系统包含: 用户 权限:二元(是/否)标志指示一个用户是否可以做 ...

随机推荐

  1. IOC技术在前端项目中的应用

    目录 背景 什么是IOC 如何实现一个IOC 第一步:实现一个容器 第二步:用好装饰器 第三步:使用容器 扩展和展望 最后 背景 前端发展至今已经过去30余年,前端应用领域在不断壮大的过程中,也变得越 ...

  2. 解决 win10 无法安装VS2019,visual studio installer下载进度始终为0

    解决 win10 无法安装VS2019,visual studio installer下载进度始终为0 目录 解决 win10 无法安装VS2019,visual studio installer下载 ...

  3. MySQL调优用户监控之show processlist

    简介 show processlist显示这台MySQL正在连接的用户: mysql> show processlist; +----+------+-----------+-------+-- ...

  4. missing required library sqlite.dll最终解决办法

    missing required library sqlite.dll最终解决办法 昨天电脑还是好的,今天早晨打开navicat连接Mysql无缘无故报错"missing required ...

  5. hook笔记①

    汇编中push 0x*** retn表示跳转到某个地址继续执行 取消hook时会在多线程环境中可能被检测 去掉函数框架可以规避寄存器cpu前后状态监测 #pragma comment(linker,& ...

  6. CobalStrike 4.0 生成后门几种方式 及 主机上线后基础操作

    出品|MS08067实验室(www.ms08067.com) 本文作者:BlackCat(Ms08067内网安全小组成员) CobalStrike 4.0 生成后门几种方式 步骤:Attacks-〉P ...

  7. There are only two hard things in Computer Science: cache invalidation and naming things.

    TwoHardThings https://martinfowler.com/bliki/TwoHardThings.html https://github.com/cch123/golang-not ...

  8. OpenSSL 常见对称加密算法特性分析

    在选择加密算法,面对一大长串的选项时,大家都有这样的疑问,究竟哪种加密方式是最好的呢? 对于加密方式.算法来说,一般安全性与性能呈负相关,越是安全的,对性能要求则更高. 现在主流的加密协议的安全性均能 ...

  9. STM32 定时器详细篇(基于HAL库)

    l  16位的向上.向下.向上/向下(中心对齐)计数模式,支持自动重装载 l  16位的预分频器 l  每个定时器都有多个独立通道,每个通道可用于 *  输入捕获 *  输出比较 *  PWM输出 * ...

  10. Spark高级数据分析——纽约出租车轨迹的空间和时间数据分析

    Spark高级数据分析--纽约出租车轨迹的空间和时间数据分析 一.地理空间分析: 二.pom.xml 原文地址:https://www.jianshu.com/p/eb6f3e0c09b5 作者:II ...