本节讲解OAuth2 相关结合spring security来实现各个服务的权限控制
OAuth2
简单介绍下oauth2是什么,做什么,以及后续结合spring security去实现
首先是什么?
它的定义我们可以在OAuth2的官网上可以看到
OAuth 2.0 is the industry-standard protocol for authorization. OAuth 2.0 supersedes the work done on the original OAuth protocol created in 2006. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices.
一句话概括下,OAuth 2.0是行业标准的授权协议。、
然后它能做什么
举个例子,当我们在第一次使用简书的时候,我们还没有注册,但是我们(懒)的注册就想要直接登陆进去怎么办呢?于是我们可以通过第三方(qq、微信、支付宝等)授权简书平台让我们登陆,如下图:
借助第三方登陆
上面就是我们比较直观的感受出它其实就是为了方便用户,为懒人服务
如何实现呢
有一种具体的表现形式,就是token认证,下面两幅摘自官网上的OAuth 2.0 Framework - RFC 6749
,名称含义如下:
1、 Third-party application:第三方应用程序,又称"客户端"(client),也就是例子中的"简书"。 2、HTTP service:HTTP服务提供商,简称"服务提供商",也就是例子中的微信、微博等 3、 Resource Owner:资源所有者,本文中又称"用户"(user)。 4、User Agent:用户代理,本文中就是指浏览器。 5、 Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。 6、Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。
oauth2根据使用场景不同,分成了4种模式
授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner password credentials) 客户端模式(client credentials)
可对照上面名称参考下面协议流程图以及刷新过期的访问令牌流程图:
+--------+ +---------------+ | |--(A)- Authorization Request ->| Resource | | | | Owner | | |<-(B)-- Authorization Grant ---| | | | +---------------+ | | | | +---------------+ | |--(C)-- Authorization Grant -->| Authorization | | Client | | Server | | |<-(D)----- Access Token -------| | | | +---------------+ | | | | +---------------+ | |--(E)----- Access Token ------>| Resource | | | | Server | | |<-(F)--- Protected Resource ---| | +--------+ +---------------+
刷新过期的访问令牌流程图
+--------+ +---------------+ | |--(A)------- Authorization Grant --------->| | | | | | | |<-(B)----------- Access Token -------------| | | | & Refresh Token | | | | | | | | +----------+ | | | |--(C)---- Access Token ---->| | | | | | | | | | | |<-(D)- Protected Resource --| Resource | | Authorization | | Client | | Server | | Server | | |--(E)---- Access Token ---->| | | | | | | | | | | |<-(F)- Invalid Token Error -| | | | | | +----------+ | | | | | | | |--(G)----------- Refresh Token ----------->| | | | | | | |<-(H)----------- Access Token -------------| | +--------+ & Optional Refresh Token +---------------+
当然具体如何实现,用什么方式实现其实是无所谓,因为只要遵循上面定义的规则就可以。已经有很多造好的轮子了,我们拿过来用就好了,如果想要更深入的研究也可以自己尝试去造轮子。这里就使用spring security。关于shiro集成有空下次再说。
为方便项目中实例定义如下
不想画了就借助网上一张图来说明,下面的为OAuth2的授权码模式
图片.png
从第2步开始,使用twitter作为第三方登陆,
第3、4步,展示twitter登录页面,输入用户名密码或者其他认证令牌例如二维码等,登陆到twitter平台
第5步 twitter服务器中校验用户名密码,校验成功,会响应浏览器一个重定向地址,并附上一个code(授权码)重定向到简书平台(重定向地址4步需要带上给微信平台,否则twitter不知到将认证令牌给谁)
第6、7 twitter验证通过后通过浏览器重定向到quora,附带有授权码,quora拿授权码去twitter获取token
第8 步 twitter返回token 用户登入quora
第9 10 11 步 浏览器请求用户资源信息,所以通过简书携带token去twitter,twitter会拿token到认证服务器做认证
第12 认证通过返回需要的资源信息
*** 至于具体url定义和请求参数、响应参数定义可参考网上给出的规定 ***
作者:勃列日涅夫
链接:https://www.jianshu.com/p/fbdb73ef9aec