理论篇(一) Spring Security+OAuth2 权限服务

目录

 

首先什么是OAuth2

Spring  Security又是什么

为什么用OAuth2

整个流程图

交互过程

第三方接入

Access Token令牌刷新

Refresh Token

客户端授权模式

概述

简化模式

授权码模式

密码模式

客户端模式

总结

声明


首先什么是OAuth2

  • oAuth2是一种协议,可以理解为是一种标准
  • 特点在与不会让第三方触及到用户的账户信息,比如用户名和密码
  • 可以在不使用账户名和密码的情况下获取到用户所授权的用户资源,所以OAuth2是安全的

Spring  Security又是什么

  • Spring Security是Spring家族里的一个安全框架,有了解过的同学应该很清楚Spring Security能够为Spring企业应用系统提供声明式的安全访问控制
  • Spring Security基于Servlet过滤器,IOC和AOP,为 Web请求和方法调用提供身份确认和权限处理,避免了代码耦合,减少大量重复代码工作

为什么用OAuth2

假设你有一个“云笔记”产品,分别有“云笔记服务”和“云相册服务”,用户则需要在不同的(pc,Android,iphone,tv,Watch)设备上来访问这些资源(“云笔记”,“云相册”),用户如何访问到属于用户自己的资源呢,传统的做法是用户提供账户和密码给“云笔记”,登陆成功后就可以获取到资源了,但是会产生以下几种问题:

  1. “云笔记服务”,“云相册服务”是分别部署的,也就是分布式部署方式,难道需要一个一个服务的登陆后才能访问?也就是单点登陆问题
  2. 公司有合作企业想要接入到我们的“云笔记”,不可能不本公司用户的账户和密码给到合作企业然后让他记录我们的用户信息吗?这不合适吧
  3. 如何限制第三方在我们“云笔记”的授权范围和使用期限呢?
  4. 如果使用账户密码登陆,假设有一个第三方应用别破解,那么就意味着用户和密码的泄露
  5. ......

而OAuth2可以帮我们解决这些个问题

整个流程图

理论篇(一) Spring Security+OAuth2 权限服务

 

交互过程

理论篇(一) Spring Security+OAuth2 权限服务

核心思想就是,客户端不可以直接访问资源服务器,必须经过认证服务器

第三方接入

比如说我“云笔记”要实现QQ登陆。

  1. 其业务流程首先是打开云笔记客户端,然后有支持QQ登陆的这么一个按钮,点击后调用QQ支持的登陆页面(图一)
  2. 在用户扫码或者输入密码后点击授权登陆的时候会访问QQ的认证服务器,然后确认核实后QQ认证服务器会返回一个授权码给“云笔记”客户端
  3. “云笔记”客户端根据这个授权码再去QQ认证服务器获取到“资源令牌”,QQ认证服务器确认授权码无误后返回一个“资源令牌
  4. 最后“云笔记”客户端再去QQ资源服务器调用用户资源,比如(用户昵称,头像,性别......)

这样就可以做到不使用账户和密码就进行登陆,简单来说就是给你自动做了一个简单的注册,只是信息没有那么全面,而且完成QQ登陆后还要进行手机号注册,不然光是昵称这些不足以知道你到底是谁

还有值得注意的一点就是在授权的时候在下面会显示给谁授权,要给他什么东西,如图一所示我要给有道云授权,可以获取我的昵称和头像还有性别

理论篇(一) Spring Security+OAuth2 权限服务
图一

Access Token令牌刷新

在上面我们提到了资源访问令牌,知道了可以根据这个令牌来访问我们所需要的资源,但是这个access token是保存在客户端上面的,而且是个临时的,因为在客户端上就会有泄露的风险如下图,可以抓包获取到你的access token,而给access token定制一个有效期限可以在一定程度上面防止泄露风险。

但是一旦设置了临时期限的时候,客户端就不是那么方便了。每次access token一过期就要重新向用户索要授权。这样用户每次可能过一天或者几天(根据程序设定时间来算)就要重新进行一次授权操作,会影响使用体验感。

为了解决这一问题,OAuth2引入了Refresh Token机制

理论篇(一) Spring Security+OAuth2 权限服务

Refresh Token

其作用就是用来刷新Access Token。认证服务器提供一个接口刷新,如下图一所示。传入refresh_token和client_id,认证服务器验证通过后,返回一个新的Access token,但是为了安全,OAuth2.0采取了两个措施

  1. 要求Refresh Token一定是保存在服务器端,也就是后台,一定不能放在如(pc端,app软件),调用refresh接口时,一定是从服务器到服务器器之间的访问
  2. OAuth2.0引入了client_secret机制,就是每一个client_id对应每一个client_secret,这个client_secret会在客户端申请client_id的时候一同返回给客户端,举个例子:微信支付中需要的App_id和App_secret就是你在有需要支付业务的时候微信支付开发平台给你分发App_id和App_secret。大概就是这个意思

假如把下面图二中的client_id和client_secret换成app_id和app_secret的话,那么对于写过微信支付对接或者登陆对接的同学是很好理解的

理论篇(一) Spring Security+OAuth2 权限服务
图一
理论篇(一) Spring Security+OAuth2 权限服务
图二

客户端授权模式

概述

客户端必须得到用户的授权(authorztion grant),才可以获取到访问令牌(access token)。而OAuth2.0定义了四种授权方式

  1. implicit:简单授权模式,官方不推荐使用,除了特定场合
  2. authorztion code:授权码模式授权,官方推荐使用,安全贼高
  3. resource owner password credentials:密码模式
  4. cilent credentials:客户端模式

简化模式

简单来说就是在你只有APP或者纯静态HTML5页面而没有服务器(后台)的时候,你要去对接第三方的系统服务,可以使用简化模式,但是该模式下一些权限信息,比如access token就很容易泄流,而且不会刷新

授权码模式

首先从app或者小程序又或者pc端访问API网关,由于是微服务开发,所以在会有网关来处理客户端访问问题,然后由API网关来访问认证服务器,在认证服务器确认你 数据无误(是个成年人)后根据你的回调地址返回一个授权码(我18岁的身份证),这是侯你要再次通过API网关来访问认证服务器来获取到access token(哈尔滨机票),最后才是你根据这个access token去访问资源服务器,这时候你就可以获取访问资源(上飞机了)

理论篇(一) Spring Security+OAuth2 权限服务

还有一种情况就是你是去访问第三方的服务器,比如说微信登陆

这个时候访问的就不是你自己的网关了,而是别人的第三方的服务器,然后根据别人的第三方服务器访问别人第三方的认证服务器,和上面相比就是,不管是API也好,还是认证服务器也好,或者是资源服务器也好,这些都是别人家的

上一篇:Spring Security Oauth2 令牌增加额外信息


下一篇:【AMAD】django-allauth