广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何利用jwt来保护你的接口服务
  • 613
分享到

如何利用jwt来保护你的接口服务

2024-04-02 19:04:59 613人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言一、Jwt是什么HeadersPlayloadSignature二、JWT生成和解析token三、token续签问题总结前言 以前写过一篇关于接口服务规范的文章,原文在此,里

前言

以前写过一篇关于接口服务规范的文章,原文在此,里面关于安全性问题重点讲述了通过appid,appkey,timestamp,nonce以及sign来获取token,使用token来保障接口服务的安全。今天我们来讲述一种更加便捷的方式,使用jwt来生成token。

一、JWT是什么

JSON WEB Token(JWT) 定义了一种紧凑且自包含的方式,用于在各方之间作为 jsON 对象安全地传输信息。该信息可以被验证和信任,因为它是经过数字签名的。JWT可以设置有效期。

JWT是一个很长的字符串,包含了Header,Playload和Signature三部分内容,中间用.进行分隔。

Headers

Headers部分描述的是JWT的基本信息,一般会包含签名算法和令牌类型,数据如下:


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

Playload

Playload就是存放有效信息的地方,JWT规定了以下7个字段,建议但不强制使用:

iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token

除此之外,我们还可以自定义内容


{
    "name":"Java旅途",
    "age":18
}

Signature

Signature是将JWT的前面两部分进行加密后的字符串,将Headers和Playload进行base64编码后使用Headers中规定的加密算法和密钥进行加密,得到JWT的第三部分。

二、JWT生成和解析token

在应用服务中引入JWT的依赖


<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>

根据JWT的定义生成一个使用RSA算法加密的,有效期为30分钟的token


public static String createToken(User user) throws Exception{

    return Jwts.builder()
        .claim("name",user.getName())
        .claim("age",user.getAge())
        // rsa加密
        .signWith(SignatureAlGorithm.RS256, RsaUtil.getPrivateKey(PRIVATE_KEY))
        // 有效期30分钟
        .setExpiration(DateTime.now().plusSeconds(30 * 60).toDate())
        .compact();
}

登录接口验证通过后,调用JWT生成带有用户标识的token响应给用户,在接下来的请求中,头部携带token进行验签,验签通过后,正常访问应用服务。


public static Claims parseToken(String token) throws Exception{
    return Jwts
        .parser()
        .setSigningKey(RsaUtil.getPublicKey(PUBLIC_KEY))
        .parseClaimsJws(token)
        .getBody();
}

三、token续签问题

上面讲述了关于JWT验证的过程,现在我们考虑这样一个问题,客户端携带token访问下单接口,token验签通过,客户端下单成功,返回下单结果,然后客户端带着token调用支付接口进行支付,验签的时候发现token失效了,这时候应该怎么办?只能告诉用户token失效,然后让用户重新登录获取token?这种体验是非常不好的,oauth2在这方面做的比较好,除了签发token,还会签发refresh_token,当token过期后,会去调用refresh_token重新获取token,如果refresh_token也过期了,那么再提示用户去登录。现在我们模拟oauth2的实现方式来完成JWT的refresh_token。

思路大概就是用户登录成功后,签发token的同时,生成一个加密串作为refresh_token,refresh_token存放在Redis中,设置合理的过期时间(一般会将refresh_token的过期时间设置的比较久一点)。然后将token和refresh_token响应给客户端。伪代码如下:


@PostMapping("getToken")
public ResultBean getToken(@RequestBody LoingUser user){

    ResultBean resultBean = new ResultBean();
    // 用户信息校验失败,响应错误
    if(!user){
        resultBean.fillCode(401,"账户密码不正确");
        return resultBean;
    }
    String token = null;
    String refresh_token = null;
    try {
        // jwt 生成的token
        token = JwtUtil.createToken(user);
        // 刷新token
        refresh_token = Md5Utils.hash(System.currentTimeMillis()+"");
        // refresh_token过期时间为24小时
        redisUtils.set("refresh_token:"+refresh_token,token,30*24*60*60);
    } catch (Exception e) {
        e.printStackTrace();
    }

    Map<String,Object> map = new HashMap<>();
    map.put("access_token",token);
    map.put("refresh_token",refresh_token);
    map.put("expires_in",2*60*60);
    resultBean.fillInfo(map);
    return resultBean;
}

客户端调用接口时,在请求头中携带token,在拦截器中拦截请求,验证token的有效性,如果验证token失败,则去redis中判断是否是refresh_token的请求,如果refresh_token验证也失败,则给客户端响应鉴权异常,提示客户端重新登录,伪代码如下:


HttpHeaders headers = request.getHeaders();
// 请求头中获取令牌
String token = headers.getFirst("Authorization");
// 判断请求头中是否有令牌
if (StringUtils.isEmpty(token)) {
    resultBean.fillCode(401,"鉴权失败,请携带有效token");
    return resultBean;
}
if(!token.contains("Bearer")){
    resultBean.fillCode(401,"鉴权失败,请携带有效token");
    return resultBean;
}

token = token.replace("Bearer ","");
// 如果请求头中有令牌则解析令牌
try {
    Claims claims = TokenUtil.parseToken(token).getBody();
} catch (Exception e) {
    e.printStackTrace();
    String refreshToken = redisUtils.get("refresh_token:" + token)+"";
    if(StringUtils.isBlank(refreshToken) || "null".equals(refreshToken)){
        resultBean.fillCode(403,"refresh_token已过期,请重新获取token");
        return resultbean;
    }
}

refresh_token来换取token的伪代码如下:


@PostMapping("refreshToken")
public Result refreshToken(String token){

    ResultBean resultBean = new ResultBean();
    String refreshToken = redisUtils.get(TokenConstants.REFRESHTOKEN + token)+"";
    String access_token = null;
    try {
        Claims claims = JwtUtil.parseToken(refreshToken);
        String username = claims.get("username")+"";
        String passWord = claims.get("password")+"";
        LoginUser loginUser = new LoginUser();
        loginUser.setUsername(username);
        loginUser.setPassword(password);
        access_token = JwtUtil.createToken(loginUser);
    } catch (Exception e) {
        e.printStackTrace();
    }
    Map<String,Object> map = new HashMap<>();
    map.put("access_token",access_token);
    map.put("refresh_token",token);
    map.put("expires_in",30*60);
    resultBean.fillInfo(map);
    return resultBean;
}

通过上面的分析,我们简单的实现了token的签发,验签以及续签问题,JWT作为一个轻量级的鉴权框架,使用起来非常方便,但是也会存在一些问题,

  • JWT的Playload部分只是经过base64编码,这样我们的信息其实就完全暴露了,一般不要将敏感信息存放在JWT中。
  • JWT生成的token比较长,每次在请求头中携带token,导致请求偷会比较大,有一定的性能问题。
  • JWT生成后,服务端无法废弃,只能等待JWT主动过期。

下面这段是我网上看到的一段关于JWT比较适用的场景:

  • 有效期短
  • 只希望被使用一次

比如,用户注册后发一封邮件让其激活账户,通常邮件中需要有一个链接,这个链接需要具备以下的特性:能够标识用户,该链接具有时效性(通常只允许几小时之内激活),不能被篡改以激活其他可能的账户,一次性的。这种场景就适合使用JWT。

总结

到此这篇关于如何利用jwt来保护你的接口服务的文章就介绍到这了,更多相关jwt保护接口服务内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何利用jwt来保护你的接口服务

本文链接: https://www.lsjlt.com/news/132419.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何利用jwt来保护你的接口服务
    目录前言一、JWT是什么HeadersPlayloadSignature二、JWT生成和解析token三、token续签问题总结前言 以前写过一篇关于接口服务规范的文章,原文在此,里...
    99+
    2022-11-12
  • 如何使用命令行来保护你的Linux服务器
    保护Linux服务器的命令行操作可以包括以下几个方面:1. 使用强密码:确保服务器上的所有用户账户都使用强密码,密码包含至少8个字符...
    99+
    2023-10-18
    Linux
  • 怎么利用SSL/TLS保护你的Linux邮件服务
    这篇文章给大家分享的是有关怎么利用SSL/TLS保护你的Linux邮件服务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。通过理解安全证书来保护你的 Linux 邮件服务。通常,不管你是通过简单邮件传输协议Simp...
    99+
    2023-06-16
  • 如何利用ASP缓存框架接口来优化你的网站?
    ASP缓存框架是一个非常有用的工具,可以帮助你优化你的网站,提高性能和用户体验。在本文中,我们将探讨如何使用ASP缓存框架接口来优化你的网站,并提供一些演示代码来帮助你更好地理解和应用这些技术。 什么是ASP缓存框架? ASP缓存框架是一种...
    99+
    2023-06-14
    缓存 框架 接口
  • 如何在Linux服务器上保护Web接口免受攻击
    保护Linux服务器上的Web接口免受攻击有多种方法和措施。以下是一些建议:1. 使用防火墙:配置服务器上的防火墙以限制对Web接口...
    99+
    2023-10-12
    Linux
  • 如何在Linux服务器上启用SSL加密以保护Web接口
    要在Linux服务器上启用SSL加密以保护Web接口,您可以按照以下步骤操作:1. 获取SSL证书:- 您可以从权威的SSL证书颁发...
    99+
    2023-10-18
    Linux
  • 如何使用Linux服务器保护Web接口免受恶意请求
    要保护Web接口免受恶意请求,可以采取以下几个步骤:1. 配置防火墙:配置防火墙以限制对Web接口的访问。只允许特定的IP地址或IP...
    99+
    2023-10-18
    Linux
  • 保护你的Linux服务器:利用命令行进行身份验证
    保护 Linux 服务器是确保系统安全的重要步骤之一。除了使用复杂的密码和密钥身份验证,还可以利用命令行进行身份验证来增加服务器的安...
    99+
    2023-10-18
    Linux
  • 学会防御:利用命令行工具保护你的Linux服务器
    保护Linux服务器是确保服务器安全的重要步骤。使用命令行工具可以提供额外的安全层,以下是一些命令行工具和技巧,可用于保护你的Lin...
    99+
    2023-10-18
    Linux
  • 如何利用 Python Spring 开发技术记录日志来保护你的应用程序?
    随着信息技术的不断发展,软件开发越来越依赖于技术的高效性和可靠性。然而,任何软件都存在一定的漏洞和错误,这些错误可能导致应用程序的崩溃,数据丢失或安全漏洞。因此,记录应用程序的日志是非常重要的,因为它可以帮助开发人员监视应用程序的运行情况并...
    99+
    2023-07-05
    spring 开发技术 日志
  • 如何使用Linux服务器保护Web接口免受会话劫持攻击
    要保护Linux服务器上的Web接口免受会话劫持攻击,可以采取以下措施:1. 使用HTTPS:使用HTTPS协议对Web接口进行加密...
    99+
    2023-10-18
    Linux
  • 如何保护利联科技服务器的安全43.240.157.xx
    对企业来说,租用服务器搭建站点可以省去备案手续,提高业务发布效率。同时服务器要面临着病毒、黑客、信息泄露等安全威胁。那么我们怎样保护服务器安全呢?通常我们都已习惯使用administrator/root帐户和密码远程访问服务器,但这种方式无...
    99+
    2023-06-05
  • 如何通过命令行工具保护你的Linux服务器
    要通过命令行工具保护Linux服务器,可以采取以下措施:1. 更新和维护系统:定期更新操作系统和软件包,以修复已知漏洞,并确保服务器...
    99+
    2023-10-18
    Linux
  • 亚马逊服务器遭受攻击:如何保护你的数据
    1. 了解攻击类型 亚马逊服务器遭受攻击的消息引起了人们对数据安全的关注。攻击者可能会利用各种方式入侵服务器,例如DDoS攻击、SQL注入、恶意软件等。了解攻击类型可以帮助你更好地保护你的数据。 2. 加强密码安全 密码是保护数据的第一道...
    99+
    2023-10-27
    亚马逊 服务器 数据
  • 阿里云服务器被莫名购买如何保护你的云资源
    阿里云服务器被莫名购买是近年来云服务领域的一个常见问题。在数字化时代,云服务器是企业的重要资源,一旦被不法分子窃取,可能会对企业造成严重的损失。因此,了解如何保护自己的云服务器,防止被莫名购买,是非常必要的。 一、阿里云服务器被莫名购买的原...
    99+
    2023-11-04
    阿里 服务器 资源
  • 阿里云服务器自动注销吗?如何保护你的数据安全?
    在使用阿里云服务器时,很多人都关心一个问题:是否可以设置自动注销呢?本文将从多个角度探讨这个问题,并提供一些保护数据安全的建议。 阿里云服务器(ECS)是一种基于云计算的弹性计算服务,为企业和个人用户提供高可靠性和高性能的虚拟服务器。然而,...
    99+
    2023-12-26
    阿里 服务器 数据
  • 你知道如何使用IDE和Shell来提高ASP接口的效率吗?
    当今互联网时代,ASP(Active Server Pages)作为一种常见的Web开发技术,已经被广泛应用于各种领域。然而,对于开发人员而言,如何提高ASP接口的效率,以及如何简化开发过程,一直是一个重要的课题。在本文中,我们将介绍如何使...
    99+
    2023-10-11
    接口 ide shell
  • 如何使用ASP和Bash接口对象来简化你的编程工作?
    ASP 和 Bash 是两种广泛使用的编程语言,它们各自都有自己的优点和缺点。然而,如果你能将它们结合起来,就可以简化你的编程工作。在本文中,我们将介绍如何使用 ASP 和 Bash 接口对象来实现这一目标。 ASP 接口对象是一种用于连接...
    99+
    2023-09-07
    bash 接口 对象
  • 租用服务器后如何保护域名的安全
    租用服务器后保护域名安全的方法:1、在域名注册时必须填写正确的信息,防止后续出现产权问题;2、需要给服务器设置相对复杂的域名密码,防止被黑客轻易破解;3、给服务器申请域名锁,从而保证域名的安全性;4、使用服务器过程中不要随意点开邮件里面的链...
    99+
    2022-10-18
  • 阿里云服务器遭受挖矿攻击如何保护你的网络安全?
    随着互联网的发展,网络安全问题日益突出,各种黑客攻击和网络犯罪事件层出不穷。其中,挖矿攻击是一种常见的网络安全威胁,它利用计算机资源进行非法的加密货币挖掘,对服务器的性能和稳定性造成严重影响。最近,阿里云服务器遭受挖矿攻击,引发广泛关注。本...
    99+
    2023-12-12
    阿里 网络安全 挖矿
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作