返回顶部
首页 > 资讯 > 后端开发 > Python >如何基于JWT实现接口的授权访问详解
  • 683
分享到

如何基于JWT实现接口的授权访问详解

2024-04-02 19:04:59 683人浏览 安东尼

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

摘要

目录 什么是JwtJWT的结构HeaderPayloadSignature解码后的JWTJWT是怎样工作的在JAVA里使用JWT引入依赖JWTService生成JWT解码J

 什么是JWT

JWT(JSON WEB Token)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各个系统之间用jsON作为对象安全地传输信息,并且可以保证所传输的信息不会被篡改。

JWT通常有两种应用场景:

  • 授权。这是最常见的JWT使用场景。一旦用户登录,每个后续请求将包含一个JWT,作为该用户访问资源的令牌。
  • 信息交换。可以利用JWT在各个系统之间安全地传输信息,JWT的特性使得接收方可以验证收到的内容是否被篡改。

本文讨论第一点,如何利用JWT来实现对API的授权访问。这样就只有经过授权的用户才可以调用API。

JWT的结构

JWT由三部分组成,用.分割开。

Header

第一部分为Header,通常由两部分组成:令牌的类型,即JWT,以及所使用的加密算法

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

Base64加密后,就变成了:

eyJhbGCioiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload

第二部分为Payload,里面可以放置自定义的信息,以及过期时间、发行人等。

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Base64加密后,就变成了:

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

Signature

第三部分为Signature,计算此签名需要四部分信息:

  • Header里的算法信息
  • Header
  • Payload
  • 一个自定义的秘钥

接受到JWT后,利用相同的信息再计算一次签名,然年与JWT中的签名对比,如果不相同则说明JWT中的内容被篡改。

解码后的JWT

​将上面三部分都编码后再合在一起就得到了JWT。

需要注意的是,JWT的内容并不是加密的,只是简单的Base64编码。 也就是说,JWT一旦泄露,里面的信息可以被轻松获取,因此不应该用JWT保存任何敏感信息。

JWT是怎样工作的

  • 应用程序或客户端向授权服务器请求授权。这里的授权服务器可以是单独的一个应用,也可以和API集成在同一个应用里。
  • 授权服务器向应用程序返回一个JWT。
  • 应用程序将JWT放入到请求里(通常放在Http的Authorization头里)
  • 服务端接收到请求后,验证JWT并执行对应逻辑。

在JAVA里使用JWT

引入依赖

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

这里使用了一个叫JJWT(Java JWT)的库。

JWT Service

生成JWT

public String generateToken(String payload) {
        return Jwts.builder()
                .setSubject(payload)
                .setExpiration(new Date(System.currentTimeMillis() + 10000))
                .signWith(SignatureAlGorithm.HS256, SECRET_KEY)
                .compact();
    }
  • 这里设置过期时间为10秒,因此生成的JWT只在10秒内能通过验证。
  • 需要提供一个自定义的秘钥。

解码JWT

public String parseToken(String jwt) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(jwt)
                .getBody()
                .getSubject();
    }

解码时会检查JWT的签名,因此需要提供秘钥。

验证JWT

public boolean isTokenValid(String jwt) {
        try {
            parseToken(jwt);
        } catch (Throwable e) {
            return false;
        }
        return true;
    }

JWT并没有提供判断JWT是否合法的方法,但是在解码非法JWT时会抛出异常,因此可以通过捕获异常的方式来判断是否合法。

注册/登录

@GetMapping("/reGIStration")
    public String register(@RequestParam String username, httpservletResponse response) {
        String jwt = jwtService.generateToken(username);
        response.setHeader(JWT_HEADER_NAME, jwt);

        return String.fORMat("JWT for %s :\n%s", username, jwt);
    }
  • 需要为还没有获取到JWT的用户提供一个这样的注册或者登录入口,来获取JWT。
  • 获取到响应里的JWT后,要在后续的请求里包含JWT,这里放在请求的Authorization头里。

验证JWT

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        String jwt = httpServletRequest.getHeader(JWT_HEADER_NAME);
        if (WHITE_LIST.contains(httpServletRequest.getRequestURI())) {
            chain.doFilter(request, response);
        } else if (isTokenValid(jwt)) {
            updateToken(httpServletResponse, jwt);
            chain.doFilter(request, response);
        } else {
            httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
        }
    }

private void updateToken(HttpServletResponse httpServletResponse, String jwt) {
        String payload = jwtService.parseToken(jwt);
        String newToken = jwtService.generateToken(payload);
        httpServletResponse.setHeader(JWT_HEADER_NAME, newToken);
    }
  • 将验证操作放在Filter里,这样除了登录入口,其它的业务代码将感觉不到JWT的存在。
  • 将登录入口放在WHITE_LIST里,跳过对这些入口的验证。
  • 需要刷新JWT。如果JWT是合法的,那么应该用同样的Payload来生成一个新的JWT,这样新的JWT就会有新的过期时间,用此操作来刷新JWT,以防过期。
  • 如果使用Filter,那么刷新的操作要在调用doFilter()之前,因为调用之后就无法再修改response了。

API

private final static String JWT_HEADER_NAME = "Authorization";
    @GetMapping("/api")
    public String testApi(HttpServletRequest request, HttpServletResponse response) {
        String oldJwt = request.getHeader(JWT_HEADER_NAME);
        String newJwt = response.getHeader(JWT_HEADER_NAME);

        return String.format("Your old JWT is:\n%s \nYour new JWT is:\n%s\n", oldJwt, newJwt);
    }

这时候API就处于JWT的保护下了。API可以完全不用感知到JWT的存在,同时也可以主动获取JWT并解码,以得到JWT里的信息。如上所示。

demo:GitHub.com/Beginner258…

参考资料:jwt.io/

总结

到此这篇关于如何基于JWT实现接口的授权访问的文章就介绍到这了,更多相关JWT接口的授权访问内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何基于JWT实现接口的授权访问详解

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

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

猜你喜欢
  • 如何基于JWT实现接口的授权访问详解
    目录 什么是JWTJWT的结构HeaderPayloadSignature解码后的JWTJWT是怎样工作的在JAVA里使用JWT引入依赖JWTService生成JWT解码J...
    99+
    2024-04-02
  • 怎么基于JWT实现接口的授权访问
    本篇内容主要讲解“怎么基于JWT实现接口的授权访问”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么基于JWT实现接口的授权访问”吧! 什么是JWTJWT(JSON Web Token...
    99+
    2023-06-29
  • Golang基于JWT与Casbin身份验证授权实例详解
    目录JWTHeaderPayloadSignatureJWT的优势JWT的使用场景CasbinCasbin可以做什么Casbin不可以做什么Casbin的工作原理实践登录接口请求To...
    99+
    2024-04-02
  • Redis中出现未授权访问如何解决
    这期内容当中小编将会给大家带来有关Redis中出现未授权访问如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。漏洞原理Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的...
    99+
    2023-06-20
  • ASP.NET Core如何使用JWT自定义角色并实现策略授权需要的接口
    ASP.NET Core如何使用JWT自定义角色并实现策略授权需要的接口,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。① 存储角色/用户所能访问的 A...
    99+
    2023-06-26
  • Spring Security基于注解的接口角色访问控制怎么实现
    本文小编为大家详细介绍“Spring Security基于注解的接口角色访问控制怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Security基于注解的接口角色访问控制怎么实现”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-06-16
  • ASP.NETCore使用JWT自定义角色并实现策略授权需要的接口
    ① 存储角色/用户所能访问的 API 例如 使用 List<ApiPermission> 存储角色的授权 API 列表。 可有可无。 可以把授权访问的...
    99+
    2024-04-02
  • .NET6实现基于JWT的Identity功能方法详解
    目录需求目标原理与思路实现引入Identity组件添加认证服务使用JWT认证和定义授权方式引入认证授权中间件添加JWT配置增加认证用户Model实现认证服务CreateToken方法...
    99+
    2024-04-02
  • Apache如何实现基于IP的访问控制
    Apache可以通过使用mod_authz_host模块来实现基于IP的访问控制。您可以通过编辑Apache的配置文件来配置基于IP的访问控制规则。 以下是一个示例配置,只允许特定IP地址范围内的用户访问您的网站: <Director...
    99+
    2024-07-05
    apache
  • Apache如何实现基于组的访问控制
    Apache可以通过使用基于组的访问控制模块来实现基于组的访问控制。其中,最常用的模块是mod_authz_groupfile模块和mod_authz_dbd模块。 mod_authz_groupfile模块允许管理员使用一个简单的文本文...
    99+
    2024-07-05
    apache
  • go - 如何在 Gin 中使用 JWT 提供基于路由的授权的静态文件?
    在使用Go编写Web应用程序时,Gin是一个非常受欢迎的框架,它提供了快速、灵活和易于使用的方式来构建API和Web应用。在许多应用程序中,我们需要提供静态文件,如CSS、JavaSc...
    99+
    2024-02-11
  • 如何使用Postman测试需要授权的接口问题
    本篇内容主要讲解“如何使用Postman测试需要授权的接口问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Postman测试需要授权的接口问题”吧!Postman是一款免费的http模...
    99+
    2023-07-02
  • Go实现基于RSA加密算法的接口鉴权
    基于 RSA 加密算法的接口鉴权方案 假设接口调用者是客户端,接口提供方是服务端,则此方案存在以下规则: 客户端需要使用 RSA 算法(1024 位长度的私钥)生成公私钥...
    99+
    2024-04-02
  • Apache如何实现基于用户名的访问控制
    Apache可以通过使用htpasswd文件和.htaccess文件来实现基于用户名的访问控制。 创建htpasswd文件:首先要创建一个包含用户名和密码的htpasswd文件。可以使用htpasswd命令行工具来创建该文件。例如,运行以...
    99+
    2024-07-05
    apache
  • 详解基于Node.js的微信JS-SDK后端接口实现代码
    做了一个网站,放到线上,用微信打开,点击分享,可是分享后发给朋友的链接卡片是微信默认自带的,如下: 这标题,描述以及图片是默认自带的,丑不说,分享给别人还以为是盗号网站呢,而接入微信的JSSDK后,分享...
    99+
    2022-06-04
    详解 后端 接口
  • 如何实现基于Node.js的微信JS-SDK后端接口
    小编给大家分享一下如何实现基于Node.js的微信JS-SDK后端接口,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!做了一个网站...
    99+
    2024-04-02
  • 如何使用Python基于接口编程的方法实现
    目录先通过一个实例来了解下接口到底解决什么问题。 定义一个接口 定义类,继承接口Python 抽象基类的介绍 (PEP3119) 软件行业,唯一不变的就是变化。产品经理会变,产品需求...
    99+
    2024-04-02
  • 关于访问后端接口报404的问题——全网最详细的404错误详解
    当我们通过前端向后端发起一个请求调用后端接口时,经常会遇到404的问题。网上关于对404问题介绍的一大堆,其实404问题的本质就两点。 在介绍404问题之前先温习一个小的知识点——项目访问路径 项目访问路径:就是定位一个项目的路径,可以...
    99+
    2023-08-16
    java spring spring boot
  • MyBatis详解如何实现Dao层接口
    目录传统开发方式编写UserDao接口编写UserDaompl实现传统测试方法代理开发方法代理开发方式介绍编写UserMapper接口测试代理方法传统开发方式 编写UserDao接口...
    99+
    2024-04-02
  • SpringBoot使用AOP实现统计全局接口访问次数详解
    目录AOP是什么AOP的作用和优势常见的动态代理技术AOP相关概念实现AOP是什么 AOP(Aspect Oriented Programming),也就是面向切面编程,是通过预编译...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作