【深入理解SpringCloud微服务】Spring-Security-OAuth2作用与原理解析
Spring-Security-OAuth2作用与原理解析
OAuth2
OAuth2作用
OAuth是一个关于授权的网络开放标准,可以允许第三方应用访问用户存储在其他服务的资源而不需要用户提供账号和密码。
比如京东接入微信开放平台,通过微信登录,其实就是允许京东访问用户存储在微信上的身份信息。

首先第一步:用户请求京东的登录页面,京东返回登录页面,浏览器展示京东的登录页面。

第二步:用户点击微信登录,浏览器请求京东后台,京东后台携带在微信开放平台注册的redirect_uri请求微信开放平台返回登录界面,微信返回登录界面后前端展示的就是一个二维码。

第三步:用户扫码,点击同意,微信授权服务器接收到登录请求,验证登录信息是否正确,如果登录信息正确,那么微信的授权服务器携带授权码回调京东的redirect_uri。

第四步:京东接收到回调后,携带code、appid、appsecret请求微信获取access_token,微信生成access_token并把它保存起来,然后返回access_token。

第五步:京东后台收到access_token后,携带access_token请求微信的资源服务器获取用户信息,获取到用户信息后返回用户信息到前端。获取到用户信息后,登录成功,前端跳转到京东首页。

OAuth2的四种角色
四种角色分别是
- Resource Owner:资源用户者,也就是用户。
- Client:客户端,也就是第三方应用。
- Authorization server:授权服务器,服务提供商(比如上面的微信)专门用于进行认证授权的服务器。
- Resource server:资源服务器,存储用户生成并存放在服务提供商的资源。
四者的关系如下图:

可见OAuth2的大体思路就是用户授权第三方应用,授权服务器就会给第三方应用颁发token,第三方应用拿到授权服务器颁发的token才可以访问资源服务器。
OAuth2四种授权模式
OAuth2规定了四种授权模式,分别是:授权码模式、密码模式、简化模式、客户端模式。
首先,不管使用哪种模式,客户端(第三方应用)都需要到目标系统进行备案,拿到客户端id(client id)和客户端密钥(client secret)。

授权码模式
授权码模式是应用最广泛并且安全性也是最高的授权模式,上面京东通过微信开放平台进行授权登录的例子就是授权码模式的例子。
流程如下:

这里最后一步返回的除access_token以外,还有一个refresh_token,这个refresh_token的作用是在access_token失效以后,可以通过refresh_token授权服务器直接颁发一个新的token,无需再走一遍这个复杂的认证授权流程。
密码模式
这种模式适合高度可信任的应用,比如公司自己的应用请求公司自己搭建的授权服务器进行认证授权,那么就可以使用密码模式。
用户直接向客户端提供用户名和密码,客户端直接拿着用户提供的用户名和密码到授权服务器进行认证授权。
这种模式要求客户端不能存储用户名和密码。
流程如下:

简化模式
这种模式适合没有后端的纯前端应用,由于没有后端,就无法使用授权码模式了。
这种模式下,只有用户同意授权,授权服务器就直接颁发token,并在重定向URI中携带该token,引导浏览器进行重定向。
流程如下:

客户端模式
这种模式适合没有前端的命令行应用。
由于没有前端,就无法通过前端界面让用户选择是否授权了,因此这种模式是客户端以自己的名义(而不是用户)请求授权服务器进行认证授权。

Spring-Security-OAuth2
Spring-Security-OAuth2整合了Spring-Security和OAuth2,是OAuth2协议的一种实现,底层基于Spring-Security做扩展。

整体架构如下:

- 用户访问第三方应用,第三方应用访问资源服务器获取资源(比如用户信息),但是此时没有token,于是OAuth2RestTemplate会报错;该报错信息被OAuth2ClientContextFilter捕获;OAuth2ClientContextFilter引导浏览器重定向到授权服务器。
- 授权服务器通过Authorization Endpoint(授权端点)进行授权,Authorization Endpoint通过AuthorizationServerTokenServices生成授权码。
- 客户端拿到授权码,请求授权服务器通过Token Endpoint(令牌端点)生成token(令牌),Token Endpoint调用AuthorizationServerTokenServices生成token,然后返回token给客户端。
- 客户端获取到token,携带token访问资源服务器请求获取资源,资源服务器通过OAuth2AuthenticationManager调用ResourceServerTokenServices进行token验证,验证通过则可以访问资源。

Spring-Security-OAuth2的使用,在Maven依赖方面,可以引入spring‐boot‐starter‐security加spring‐security‐oauth2,也可以直接引入spring‐cloud‐starter‐oauth2
- spring‐boot‐starter‐security + spring‐security‐oauth2
- spring‐cloud‐starter‐oauth2
Maven依赖引入后,就是在配置类做各种配置,比如spring security的配置,授权服务器配置,资源服务器配置等。其中授权服务器需要通过@EnableAuthorizationServer注解声明开启,而资源服务器需要通过@EnableResourceServer注解声明开启。
具体配置这里就不展开说了,没有什么技术含量,网上也一大推资料。
更多推荐

所有评论(0)