OAuth2.0实战!使用JWT令牌认证!

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: OAuth2.0实战!使用JWT令牌认证!

今天这篇文章介绍一下OAuth2.0如何集成JWT颁发令牌,这也是目前企业中主流的令牌形式。

文章目录如下:

什么是JWT?

OAuth2.0体系中令牌分为两类,分别是透明令牌不透明令牌

不透明令牌则是令牌本身不存储任何信息,比如一串UUID,上篇文章中使用的InMemoryTokenStore就类似这种。

因此资源服务拿到这个令牌必须调调用认证授权服务的接口进行令牌的校验,高并发的情况下延迟很高,性能很低,正如上篇文章中资源服务器中配置的校验,如下:

透明令牌本身就存储这部分用户信息,比如JWT,资源服务可以调用自身的服务对该令牌进行校验解析,不必调用认证服务的接口去校验令牌。

JWT相信大家都有了解,分为三部分,分别是头部载荷签名,如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJhdWQiOlsicmVzMSJdLCJ1c2VyX25hbWUiOiJ1c2VyIiwic2NvcGUiOlsiYWxsIl0sImV4cCI6MTYzODYwNTcxOCwiYXV0aG9yaXRpZXMiOlsiUk9MRV91c2VyIl0sImp0aSI6ImRkNTVkMjEzLThkMDYtNGY4MC1iMGRmLTdkN2E0YWE2MmZlOSIsImNsaWVudF9pZCI6Im15anN6bCJ9.
koup5-wzGfcSVnaaNfILwAgw2VaTLvRgq2JVnIHYe_Q

头部定义了JWT基本信息,如类型和签名算法。

载荷包含了一些基本信息(签发时间、过期时间.....),另外还可以添加一些自定义的信息,比如用户的部分信息。

签名部分将前两个字符串用 . 连接后,使用头部定义的加密算法,利用密钥进行签名,并将签名信息附在最后。

OAuth2.0认证授权服务搭建

OAuth2.0分为认证授权中心、资源服务,认证中心用于颁发令牌,资源服务解析令牌并且提供资源。

1、案例架构

新建oauth2-auth-server-jwt模块,沿用上篇文章妹子始终没搞懂OAuth2.0,今天整合Spring Cloud Security 一次说明白!的代码,在其之上做些修改,目录如下:

2、令牌配置

令牌相关的配置都放在了AccessTokenConfig这个配置类中,代码如下:

1、 JwtAccessTokenConverter

令牌增强类,用于JWT令牌和OAuth身份进行转换

2、TokenStore

令牌的存储策略,这里使用的是JwtTokenStore,使用JWT的令牌生成方式,其实还有以下两个比较常用的方式:

  • RedisTokenStore:将令牌存储到Redis中,此种方式相对于内存方式来说性能更好
  • JdbcTokenStore:将令牌存储到数据库中,需要新建从对应的表,有兴趣的可以尝试

3、SIGN_KEY

JWT签名的秘钥,这里使用的是对称加密,资源服务中也要使用相同的秘钥进行校验和解析JWT令牌

注意:实际工作中还是要使用非对称加密的方式,比较安全,这种方式后续文章介绍。

3、令牌管理服务的配置

这个放在了AuthorizationServerConfig这个配置类中,代码如下:

使用的是DefaultTokenServices这个实现类,其中可以配置令牌相关的内容,比如access_tokenrefresh_token的过期时间,默认时间分别为12小时、30天。

最重要的一行代码当然是设置令牌增强,使用JWT方式生产令牌,如下:

services.setTokenEnhancer(jwtAccessTokenConverter);

4、令牌访问端点添加tokenServices

AuthorizationServerEndpointsConfigurer中添加这个令牌服务,代码如下:

好了,至此认证中心的JWT令牌生成方式配置完成了.........

案例源码已经上传GitHub,关注公众号:码猿技术专栏,回复关键词 9529 获取!

OAuth2.0资源服务搭建

资源服务搭建非常简单了,配置一个JWT令牌校验服务即可。

1、案例架构

新建一个oauth2-auth-resource-jwt模块,目录如下:

2、令牌配置

直接复用授权服务的AccessTokenConfig,由于资源服务需要校验解析JWT令牌,因此直接复用即可,代码如下:

注意:这里的JWT加密的秘钥一定要和认证中心的一样。

3、配置令牌服务

生成的ResourceServerTokenServices对象,其中使用JWT令牌增强,如下:

4、资源ID和令牌校验服务配置

资源id令牌服务配置到ResourceServerSecurityConfigurer中,代码如下:

由于使用了JWT这种透明令牌,令牌本身携带着部分用户信息,因此不需要通过远程调用认证中心的接口校验令牌。

案例源码已经上传GitHub,关注公众号:码猿技术专栏,回复关键词 9529 获取!

测试

下面通过获取令牌、调用资源进行测试逻辑是否走通。

1、使用密码模式获取令牌

POSTMAN请求如下:

可以看到已经成功返回了JWT令牌。

2、携带令牌调用资源服务

直接拿着获取的access_token调用资源服务的接口,请求如下:

好了,JWT令牌测试成功............

源码追踪

源码中最重要的部分当然是获取令牌、校验令牌这两个流程了,小陈某下面详细说说。

1、获取令牌

获取令牌就比较简简单了,当然从接口 /oauth/token入手了,这个接口在TokenEndpoint#postAccessToken()方法中,如下图:

这个方法中有两个关键步骤,如下:

1、根据clientId加载客户端信息

这一步是从根据客户端传入的clientId获取客户端的详细信息,代码如下:

ClientDetails authenticatedClient = getClientDetailsService().loadClientByClientId(clientId);

这里的ClientDetailsService有两类,如下:

  • InMemoryClientDetailsService:客户端配置存储在内存中,本篇文章所使用的便是这个
  • JdbcClientDetailsService:客户端配置存储在数据库中,后续文章介绍

2、生成OAuth2AccessToken返回客户端

OAuth2AccessToken是封装的返回对象,/oauth/token这个接口的作用就是将令牌封装到OAuth2AccessToken返回,代码如下:

OAuth2AccessToken token = getTokenGranter().grant(tokenRequest.getGrantType(), tokenRequest);

getTokenGranter():获取授权类型,比如密码类型、授权码类型

grant():这个方法则是真正的业务方法,其中调用DefaultTokenServices#createAccessToken() 方法生成令牌。

DefaultTokenServices这个还记得吗,令牌服务,在AuthorizationServerConfig配置文件配置的,如下:

createAccessToken()方法内部真正的业务方法其实是JwtAccessTokenConverter#enhance(),内部生成JWT令牌,封装进入OAuth2AccessToken对象返回,方法如下:

JwtAccessTokenConverter这个还记得吗?令牌增强类,在AccessTokenConfig这个配置文件中配置的,如下:

主流程图如下:

2、校验令牌

校验令牌的更加简单了,入口就在OAuth2AuthenticationProcessingFilter这个过滤器,内部会调用OAuth2AuthenticationManager中的authenticate()方法进行验证令牌。

校验主流程如下:

自己debug跟着源码试试吧............

相关文章
|
3月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
220 0
|
1月前
|
数据采集 JSON 算法
Python爬虫——基于JWT的模拟登录爬取实战
Python爬虫——基于JWT的模拟登录爬取实战
Python爬虫——基于JWT的模拟登录爬取实战
|
1月前
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
【10月更文挑战第2天】在当今互联网世界中,数据安全与隐私保护日益重要。Python 作为广泛应用于 Web 开发的语言,其认证机制也不断进化。OAuth 2.0 和 JSON Web Tokens (JWT) 成为当前最热门的安全认证方案,不仅保障数据安全传输,还简化了用户认证流程。本文将介绍 Python 如何结合 OAuth 2.0 和 JWT 打造安全高效的认证体系。
37 3
|
12天前
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
在当今互联网世界中,数据安全和隐私保护至关重要。Python 作为 Web 开发的主流语言,其认证机制也在不断进步。OAuth 2.0 和 JSON Web Tokens (JWT) 是当前最热门的安全认证方案,不仅保障数据安全传输,还简化用户认证流程。本文介绍如何在 Python 中结合 OAuth 2.0 和 JWT,打造一套既安全又高效的认证体系。通过 Flask-HTTPAuth 和 PyJWT 等库,实现授权和验证功能,确保每次请求的安全性和便捷性。
27 3
|
20天前
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
|
1月前
|
存储 JSON 算法
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
文章介绍了JWT令牌的基础教程,包括其应用场景、组成部分、生成和校验方法,并在Springboot中使用JWT技术体系完成拦截器的实现。
69 0
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
|
2月前
|
安全 Java 数据安全/隐私保护
|
2月前
|
JSON 安全 数据安全/隐私保护
Python 安全性大揭秘:OAuth 与 JWT,不只是认证,更是信任的传递
【9月更文挑战第4天】在数字化时代,确保应用安全至关重要。Python 作为广泛使用的编程语言,提供了强大的安全认证工具,如 OAuth 和 JWT。OAuth 是一种授权框架,允许第三方应用在有限权限下访问用户资源;JWT 则是一种自包含的数据传输格式,用于安全地传递声明。通过合理配置和使用这些技术,可以有效提升应用安全性,保障用户数据安全。正确管理和定期更新密钥、严格测试 JWT 的生成与验证等最佳实践,对于构建安全可靠的应用至关重要。不断学习新威胁,是维护应用安全的永恒课题。
52 2
|
3月前
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
|
3月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
317 0

热门文章

最新文章