大家好,我是不才陈某~ 周一发了Spring Security 系列第一篇文章,有妹子留言说看了很多文章,始终没明白OAuth2.0,这次陈某花了两天时间,整理了OAuth2.0相关的知识,结合认证授权服务+资源服务,一次性给大家唠明白! 这是《Spring Security 进阶》第2篇文章,往期文章如下:
本篇文章介绍一下OAuth2.0相关的知识点,并且手把手带大家搭建一个认证授权中心、资源服务进行OAuth2.0四种授权模式的验证,案例源码详细,一梭子带大家了解清楚。 本篇文章的案例源码项目架构为:Spring Boot + Spring Cloud Alibaba + Spring Security ,Spring Cloud Alibaba有不了解可以看下陈某的往期《Spring Cloud 进阶》文章:
文章目录如下: 为什么需要OAuth2.0?编码永远都是为了解决生产中的问题,想要理解为什么需要OAuth2,当然要从实际生活出发。 举个例子:小区的业主点了一份外卖,但是小区的门禁系统不给外卖人员进入,此时想要外卖员进入只能业主下来开门或者告知门禁的密码。 密码告知外卖员岂不是每次都能凭密码进入小区了,这明显造成了安全隐患。 那么有没有一种方案:既能不泄露密码,也能让外卖小哥进入呢? 于是此时就想到了一个授权机制,分为以下几个步骤:
另外这个授权的密码不仅可以通过门禁,还可以通过楼下的门禁,这就非常类似于网关和微服务了。 令牌和密码的区别?上述例子中令牌和密码的作用是一样的,都可以进入小区,但是存在以下几点差异:
什么是OAuth2?OAuth 是一个开放标准,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像、照片、视频等),而在这个过程中无需将用户名和密码提供给第三方应用。实现这一功能是通过提供一个令牌(token),而不是用户名和密码来访问他们存放在特定服务提供者的数据。 采用令牌(token)的方式可以让用户灵活的对第三方应用授权或者收回权限。 OAuth2 是 OAuth 协议的下一版本,但不向下兼容 OAuth 1.0。 传统的 Web 开发登录认证一般都是基于 session 的,但是在前后端分离的架构中继续使用 session 就会有许多不便,因为移动端(Android、iOS、微信小程序等)要么不支持 cookie(微信小程序),要么使用非常不便,对于这些问题,使用 OAuth2 认证都能解决。 对于大家而言,我们在互联网应用中最常见的 OAuth2 应该就是各种第三方登录了,例如 QQ 授权登录、微信授权登录、微博授权登录、GitHub 授权登录等等。 OAuth2.0的四种模式?OAuth2.0协议一共支持 4 种不同的授权模式:
1、授权码模式这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。 令牌获取的流程如下: 上图中涉及到两个角色,分别是客户端、认证中心,客户端负责拿令牌,认证中心负责发放令牌。 但是不是所有客户端都有权限请求令牌的,需要事先在认证中心申请,比如微信并不是所有网站都能直接接入,而是要去微信后台开通这个权限。 至少要提前向认证中心申请的几个参数如下:
1、请求授权码 客户端需要向认证中心拿到授权码,比如第三方登录使用微信,扫一扫登录那一步就是向微信的认证中心获取授权码。 请求的url如下:
上述这个url中携带的几个参数如下:
2、返回授权码 第1步请求之后,认证中心会要求登录、是否同意授权,用户同意授权之后直接跳转到
上述链接中的 3、请求令牌 客户端拿到授权码之后,直接携带授权码发送请求给认证中心获取令牌,请求的url如下:
相同的参数同上,不同参数解析如下:
4、返回令牌 认证中心收到令牌请求之后,通过之后,会返回一段JSON数据,其中包含了令牌access_token,如下:
access_token则是颁发的令牌,refresh_token是刷新令牌,一旦令牌失效则携带这个令牌进行刷新。 2、简化模式这种模式不常用,主要针对那些无后台的系统,直接通过web跳转授权,流程如下图: 这种方式把令牌直接传给前端,是很不安全的。因此,只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,通常就是会话期间(session)有效,浏览器关掉,令牌就失效了。 1、请求令牌 客户端直接请求令牌,请求的url如下:
这个url正是授权码模式中获取授权码的url,各个参数解析如下:
2、返回令牌 认证中心认证通过后,会跳转到redirect_uri,并且后面携带着令牌,链接如下:
3、密码模式密码模式也很简单,直接通过用户名、密码获取令牌,流程如下: 1、请求令牌 认证中心要求客户端输入用户名、密码,认证成功则颁发令牌,请求的url如下:
参数解析如下:
2、返回令牌 上述认证通过,直接返回JSON数据,不需要跳转,如下:
access_token则是颁发的令牌,refresh_token是刷新令牌,一旦令牌失效则携带这个令牌进行刷新。 4、客户端模式适用于没有前端的命令行应用,即在命令行下请求令牌。 这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。 流程如下: 1、请求令牌 请求的url为如下:
参数解析如下:
2、返回令牌 认证成功后直接返回令牌,格式为JSON数据,如下:
OAuth2.0的认证中心搭建为了方便测试OAuth2的四种授权模式,这里为了方便测试,简单搭建一个认证中心,后续会逐渐完善。 1、案例架构陈某使用的是Spring Boot + Spring Cloud Alibaba 作为基础搭建,新建一个 “ 2、添加依赖Spring Boot 和 Spring Cloud 的相关依赖这里陈某就不再说了,直接上Spring Security和OAuth2的依赖,如下:
3、Spring Security安全配置这里主要涉及到Spring Security的配置,有不清楚的可以陈某第一篇文章:实战!Spring Boot Security+JWT前后端分离架构登录认证!
1、加密方式 采用BCryptPasswordEncoder加密,如下: 2、配置用户 这里为了方便测试,直接将用户信息存储在内存中,后续完善,代码如下: 上述代码配置了两个用户,如下:
3、注入认证管理器AuthenticationManager
4、配置安全拦截策略 由于需要验证授权码模式,因此开启表单提交模式,所有url都需要认证,代码如下: 4、令牌存储策略配置令牌支持多种方式存储,比如内存方式、Redis、JWT,比较常用的两种则是Redis、JWT。 这里暂时使用内存存储的方式,一旦服务器重启令牌将会失效。 代码如下: 5、OAuth2.0的配置类不是所有配置类都可以作为OAuth2.0认证中心的配置类,需要满足以下两点:
代码如下: AuthorizationServerConfigurerAdapter需要实现的三个方法如下: 下面便是围绕这三个方法进行OAuth2的详细配置。 6、客户端配置在介绍OAuth2.0 协议的时候介绍到,并不是所有的客户端都有权限向认证中心申请令牌的,首先认证中心要知道你是谁,你有什么资格? 因此一些必要的配置是要认证中心分配给你的,比如客户端唯一Id、秘钥、权限。 客户端配置的存储也支持多种方式,比如内存、数据库,对应的接口为:org.springframework.security.oauth2.provider.ClientDetailsService,接口如下: 同样这里为了方便测试,依然是加载在内存中,后续完善,完整的配置如下: 几个重要参数说一下,如下:
7、授权码服务配置使用授权码模式必须配置一个授权码服务,用来颁布和删除授权码,当然授权码也支持多种方式存储,比如内存,数据库,这里暂时使用内存方式存储,代码如下: 8、令牌服务的配置除了令牌的存储策略需要配置,还需要配置令牌的服务 9、令牌访问端点的配置目前这里仅仅配置了四个,分别如下:
详细代码如下: spring Security框架默认的访问端点有如下6个:
当然如果业务要求需要改变这些默认的端点的url,也是可以修改的,
第一个参数:需要替换的默认端点url 第二个参数:自定义的端点url 10、令牌访问安全约束配置主要对一些端点的权限进行配置,代码如下: OAuth2.0的资源服务搭建客户端申请令牌的目的就是为了访问资源,当然这个资源也是分权限的,一个令牌不是所有资源都能访问的。 在认证中心搭建的第6步配置客户端详情的时候,一行代码 1、案例架构陈某使用的是Spring Boot + Spring Cloud Alibaba 作为基础搭建,新建一个 “ 2、OAuth2.0的配置类作为资源服务的配置类必须满足两个条件,如下:
代码如下: 3、令牌校验服务配置由于认证中心使用的令牌存储策略是在内存中的,因此服务端必须远程调用认证中心的校验令牌端点**/oauth/check_token**进行校验。 代码如下: “ 4、配置客户端唯一id和令牌校验服务上文说到客户端有一个唯一标识,因此需要配置上,代码如下: 5、配置security的安全机制上文在认证中心的第6步配置客户端详情那里,有一行代码 拦截方式如下:
详细配置代码如下: 这里陈某配置了所有路径都需要all的权限。 6、新建测试接口新建了两个接口,如下:
OAuth2.0的四种模式测试下面结合认证中心、资源服务对OAuth2.0的四种服务进行测试。 启动上述搭建的认证中心和资源服务,如下图: 授权码模式1、获取授权码 请求的url如下:
浏览器访问,security需要登录,如下: 输入用户名user,密码123,成功登录。 此时来到了确认授权的页面,如下: 选择Apporove、确认授权,成功跳转到了百度页面,并且携带了授权码,如下: 这里的6yV2bF就是获取到的授权码。 2、获取token
注意:/oauth/token获取token的接口请求允许的方式要配置在授权服务器中,比如配置POST方式,代码如下:
POSTMAN请求如下图: 3、访问资源服务 拿着令牌访问资源服务的**/hello**接口,请求如下: 请求头需要添加Authorization,并且值为Bearer+" "+access_token的形式。 注意:Bearer后面一定要跟一个空格。 密码模式密码模式比较简单,不用先获取授权码,直接使用用户名、密码获取token。 POSTMAN请求如下: PS:访问资源自己拿着获取到的令牌尝试下..... 简化模式简化模式就很简单了,拿着客户端id就可以获取token,请求的url如下:
这个过程和获取授权码一样,需要登录,同意授权 最终跳转到百度,链接后面直接携带了令牌,如下: 上图中的0d5ecf06-b255-4272-b0fa-8e51dde2ce3e则是获取的令牌。 PS:访问资源自己尝试下.......... 客户端模式请求的url如下:
POSTMAN请求如下: PS:访问资源自己尝试下.......... OAuth2.0 其他端点的测试Spring Security OAuth2.0还提供了其他的端点,下面来逐一测试一下。 1、刷新令牌OAuth2.0提供了令牌刷新机制,一旦access_token过期,客户端可以拿着refresh_token去请求认证中心进行令牌的续期。 请求的url如下:
POSTMAN请求如下: 2、校验令牌OAuth2.0还提供了校验令牌的端点,请求的url如下:
POSTMAN请求如下: 总结本文介绍了OAuth2.0协议原理、四种授权模式,并且搭建了认证授权中心、资源服务进行了四种模式的测试。 作为OAuth2.0入门教程已经非常详细了........... 最后说一句(别白嫖,求关注)陈某每一篇文章都是精心输出,已经写了3个专栏,整理成PDF,获取方式如下:
如果这篇文章对你有所帮助,或者有所启发的话,帮忙点赞、在看、转发、收藏,你的支持就是我坚持下去的最大动力! |
|
来自: woh5r1ofyffxnh > 《待分类》