OAuth2.0实现原理

OAuth2.0实现原理,第1张

OAuth20是一个授权框架,他规定了客户从授权服务器获取令牌Token的规则。

要理解OAuth20,先要知道为什么会有这个东西产生,或者说他能帮我们解决什么问题,其实简单说他就是帮我们解决了访问安全问题。先看如下的一张图:

显示了我们没有引入任何安全机制情况下的资源访问过程,可以看到正常的用户和恶意的用户都可以通过向资源服务器的接口发送请求获得用户数据。显然恶意用户不该获取数据,他是非法获得,这个情况不应该被允许,需要一种机制保护用户数据。

OAuth20包含了资源拥有者,授权服务器,客户应用,授权服务器,资源服务器。
客户应用: 通常是一个 WebWeb 或者无线应用,它需要访问用户的。
资源服务器: 是一个 webweb 站点 或者 web service web service web service web service API ,用户的受保护。
授权服务器: 在客户应用成功认证并获得授权之后,向客户应用颁发访问令牌Access Token。
资源拥有者: 资源的拥有人,想要分享某些资源给第三方应用。

1)授权码(Authorization Code Token),仅用于授权码授权类型,用于交换获取访问令牌和刷新令牌
2)刷新令牌(Refresh Token),用于去授权服务器获取一个新的访问令牌
3)访问令牌(Access Token),这是OAuth令牌类型中最核心的一个,用于代表一个用户或服务直接去访问受保护的资源
4)Bearer Token,不管谁拿到Token都可以访问资源,像现钞
5)Proof of Possession(PoP) Token,可以校验client是否对Token有明确的拥有权

上面提到了需要提供一种机制来保护数据,OAuth20提供的就是一种授权机制,就是说用户要访问资源必须先通过授权服务器授权拿到Access Token(访问授权),他拿着这个Access Token才能去资源服务器去要他想要的数据,示意图如下:

这里看到我们引入了一个授权服务器,这个授权服务器就是专门负责颁发Access Token的,客户应用需要从授权服务器中获得Access Token,获得后再向资源服务器去获取数据,请求中包含了Token一起发到资源服务器,资源服务器首先要验证这个Token是否合法,如果合法再返回数据给客户应用。
上图中红色圈圈圈起来的就是OAuth20框架协议工作的地方,他规定了客户应用如何获取Access Token,以及如何使用Token的整个过程。

其中核心的授权服务器包括了授权端点,令牌端点,校验端点,注销端点,如下图所示:

OAuth20中规定了多种授权模式,各种模式实现的复杂程度和安全系数不一样,我们先分别看一下四种授权模式:
1)授权码(Authrization Code)模式:
基本流程是先通过前端渠道客户获取授权码,然后通过后端渠道,客户使用Authrization Code去交换Access Token和可选的Refresh Token,这种模式是最安全的模式,因为令牌不会通过user-agent去传递,完整的过程如下图:

授权码模式的优点是比较安全,他可以有token过期时间,而且上面的第四和第五步都是在服务器之间的访问,很难被截获,用户信息也存在服务端,这样就保证了他的安全性。他的缺点是需要进行多次请求才能访问到资源。
授权码模式假定资源拥有者和客户不在一台设备上,他拥有高安全性的保障,目前市面上主流的第三方认证都是采用这种模式。

2)隐式/简化(Implicit)模式
基本流程是Access Token直接通过前端渠道从授权服务器返回,完整的过程如下图:

3)密码(Resource Owner Password)模式
基本流程是使用用户名/密码作为授权方式从授权服务器上获取Access Token,而且一般不支持refresh token,完整的过程如下图:

4)客户端(Client)模式
基本流程是通过后端渠道去获取一个Access Token,因为客户凭证可以使用对称或者非对称加密,该方式支持共享密码和证书,完整的过程如下图:

客户端模式适合用作服务器间通信场景。

授权码模式有一个基本的选择流程,如下图:

1 由于 spring cloud gateway 是基于 WebFlux 框架实现的,该网关作为资源服务器时不能使用 @EnableResourceServer 注解,需要使用 @EnableWebFluxSecurity 注解来配置安全过滤链。

2 在 springboot 22 之前的版本中,安全框架对应的是 spring-security 514,该版本只实现了基于 id token (jwk) 的认证,而我当前项目中的认证服务组件是基于 orgspringframeworkcloud:spring-cloud-starter-oauth2 框架开发,使用的是秘钥签名的 access token,所以网关服务组件需要使用 springboot 22 + spring security 52 来处理 jws。

3 现有项目使用了 gradle 构建,是一个多模块的结构,其中主模块引入了 212RELEASE 版本的 orgspringframeworkboot 插件,用来确保各模块中 spring 组件的版本统一,此时子模块是无法通过修改插件版本号或重新引入插件来改变模块中 springboot 的版本,所以网关模块想用要引入 springboot 22 的话,就得脱离主模块,或者将插件引入的 *** 作直接下放到各个子模块的构建过程中。

4 orgspringframeworkcloud:spring-cloud-starter-oauth2 中 orgspringframeworksecurityjwtcryptosignMacSigner 支持使用短密码的 HMACSHA256 签名算法,NimbusReactiveJwtDecoder 不支持短密码。

这篇文章的主要内容来源于另外一个作者,文章地址: 移花接木:针对OAuth2的CSRF攻击
不过针对 OAuth20 的 CSRF 攻击我有两个疑问点,先列出来:
1如果授权码(Authorization code)和 client_id、redirect_uri 是绑定的,即便攻击者把 Tonr 网站触发申请令牌的 >OAuth2已经成为了一个授权的标准协议,大家在很多的产品中都能看到它的身影,比如我们登录一个网站,支持微信,QQ等登录方式,这里QQ和微信提供了授权服务。有很多的授权组件都能提供这种OAuth2认证方式,比如keycloak等,但我们也可以在SpringBoot security中实现OAuth2授权,这篇文章将详细讲解每一个步骤来演示如何在SpringBoot中实现OAuth2授权。

OAuth 2 是一种授权协议,用于通过 >

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/12738754.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存