Spring Security(8) oauth2协议介绍
oath2协议
基本介绍
开放授权(Open Authorization,OAuth)是一种资源提供商用于授权第三方应用代表资源所有者获
取有限访问权限的授权机制。由于在整个授权过程中,第三方应用都无须触及用户的密码就可以取得
部分资源的使用权限,所以OAuth是安全开放的。 目前的版本是2.0 版本;
OAuth协议:https://tools.ietf.org/html/rfc6749
比较常见的功能就是当登录一个网站的时候,可以使用qq 或微信等进行授权登录,并能够获取到qq 或微信的头像等信息。就是一种oauth的典型应用。
角色
在oauth2中主要角色有
Resource Owner:资源所有者,通常指用户;
Thirdparty application: 三方程序,也叫客户端 。需要请求其他系统的授权服务器的是客户端
Resource server:资源服务器 ,存储了想要获取的信息比如用户头像等
Authorization server 授权服务器,用来颁发请求令牌和校验等操作
主要的执行流程如下:

(A)客户端要求用户提供授权许可。
(B)用户同意向客户端提供授权许可。
(C)客户端携带用户提供的授权许可向授权服务器申请资源服务器的访问令牌。
(D)授权服务器验证客户端及其携带的授权许可,确认有效后发放访问令牌。
(E)客户端使用访问令牌向资源服务器申请资源。
(F)资源服务器验证访问令牌,确认无误后向客户端提供资源。
oauth2.0登录分析
以qq授权登录使用qq登录分析;

资源所有者就是登录的人,资源存放在qq的资源服务器上,只有登录了才能获取到;
点击使用qq登录,客户端(新浪网)跳转到qq的授权服务器进行登录请求;
在登录请求中会有一些关键信息
scope 要获取的那些权限信心
redirect_uri 登录成功后跳转的新浪网的连接
执行登录请求
登录完成后,会询问是否同意获取相关的权限。点击同意后,跳转到重定向的url ,同时会携带一个授权码,由客户端处理回调逻辑;
客户端 通过回调拿到授权码后,在后台访问授权服务器的接口 由授权码 获取access_token
再由access_token 调用资源服务器的接口,拿到用户的相关信息;
多种授权模式
授权模式的前提是客户端需要先向服务提供者申请客户端ID(client id) 和客户端秘钥 (client secret),在通过授权码获取access token 的时候都是需要 客户端id 和秘钥信息的。
oauth2 根据不同的应用场景大致分为4种授权模式。
授权码模式
response_type:code
最常用的一种模式,基本流程是
注意这里客户端指的是 三方应用,服务网站 是拥有授权服务器和资源服务器的网站;
- 客户端提前在服务网站申请clientId 和client secret
- 用户 通过浏览器 登录客户端 网站 –> 客户端网址重定向到 服务网站的登录地址并且携带参数
- client_id:表示客户端的ID
- response_type:表示授权类型 ,授权码模式就传 code
- scope:表示申请的权限范围
- redirect_uri:表示重定向URI
- state 客户端的状态,授权服务器不做处理,原样通过callback返回
- 用户在服务网站完成登录后,会提示是否允许授权获取xx 权限,(此权限都是传的scope参数指定的),点击确定后,回调 redirect_uri 同时带上了 一个 auth_code 也就是授权码,此授权码是用来交换访问token的
- 客户端通过接口获取到授权码后,在后端 调用授权服务器的接口,带上授权码信息和client_id 和client secret 来获取访问token信息
- 服务网站根据授权码返回一个有失效时间的访问token
- 后续客户端就可以使用这个访问token来请求对应的资源接口
简化模式
response_type:token
简化模式的最大特点是省略了通过授权码交换访问token的这个步骤,直接通过redirect_uri返回了访问token;
这种模式适合只有前端应用没有后端应用没办法使用交换授权码这个步骤的时候。
- 客户端进行重定向跳转指定信息
- client_id:表示客户端的ID
- response_type:表示授权类型 ,授权码模式就传 token
- scope:表示申请的权限范围- redirect_uri:表示重定向URI
- 完成验证后,通过redirect_uri 返回的时候直接在url上返回token信息
注意:此种模式直接暴露token在前端页面,不是很安全。
密码模式
grant_type=password
密码模式的特点是客户端直接将用户名和密码发送给服务端。服务端将token返回给客户端。但是客户端是不能存储密码的,这种模式适合客户端是高度信任的应用的时候。
基本流程非常简单就是客户端将用户名和密码一并发送给授权服务器;授权服务器返回对应的授权信息;
客户端模式
grant_type=client_credentials
客户端模式表示的是 客户端以自己的名义去申请权限,而不是用户通过客户端去申请权限。
一般用来提供给完全信任的服务器端服务。
基本流程:客户端直接携带 client_id,client_secret 去申请权限,通过后返回给令牌信息。


