赞
踩
如今很多互联网应用中,OAuth2 是一个非常重要的认证协议,很多场景下都会用到它,Spring Security 对 OAuth2 协议提供了相应的支持。开发者非常方便的使用 OAuth2 协议
OAuth 是一个开放标准,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源 (如头像、照片、视频等),并且在这个过程中无须将用户名和密码提供给第三方应用。通过令牌 (token) 可以实现这一功能。每一个令牌授权一个特定的网站在特定的时间段内允许可访问特定的资源。OAuth 让用户可以授权第三方网站灵活访问它们存储在另外一些资源服务器上的特定信息,而非所有的内容。对于用户而言,我们在互联网应用中最常见的 OAuth 应用就是各种第三方登录,例如 QQ授权登录、微信授权登录、微博授权登录、GitHub 授权登录等。
例如用户想登录 Ruby China ,传统方式是使用用户名和密码但是这样并不安全,因为网站会存储你的用户名密码,这样可能会导致密码泄露。这种授权方式安全隐患很大如果使用 OAuth 协议就能很好地解决这一问题。
oAuth2协议解决了多个网站登录问题,账号密码不安全的问题,比如一些小众的网站就可以不用注册登录,使用 oAuth2,也就是通过第三方向要访问的网站发送请求获取Token,第三方网站每次请求写到Token就可以访问到内容。
注意:OAuth2 是 OAuth 协议的下一个版本,但不兼容 OAth 1.0 ,OAth2 关注客户端开发者的简易性,同时为 Web 应用、桌面应用、移动设备、 IOT 设备提供专门的认证流程。
oAuth2就是对用户的信息进步的保护**,如很多喜欢将所有密码设置为同样的,就可能会泄露,但是通过已经注册过的网站用户信息,来进行授权给第三方网站信息进行登录则免去了注册,oAuth主要做的就是****认证保护用户隐私安全**
角色梳理 :第三方应用 <--------> 存储用户私密信息应用 ----------> 授权服务器 ------> 资源服务器
整体流程如下
官网流程 :
(A) 用户打开客户端以后,客户端要求用户给予授权。
(B) 用户同意给予客户端授权。
© 客户端使用上一步获得的授权,向认证服务器申请令牌。
(D) 认证服务器对用户端进行认证以后,确认无误,同意发放令牌。
(E) 客户端使用令牌,向资源服务器申请资源。
(F) 资源服务器确认令牌无误,同意向客户端开放资源。
例子流程:
从上图中我们可以看出六个步骤之中,B是关键,即用户怎么才能给于客户端授权。同时会发现 OAuth2 中包含四种不同角色:
Client :第三方应用。
Resource Owner:资源所有者。
Authorizetion Server :授权服务器。
Resource Server :资源服务器。
授权服务器和资源服务器可以放一起,但是在如今的互联网和分布的推动下,都是分别存储。
OAuth2 协议一种支持四种不同的授权模式:
用的最多的就是 最多的就是授权码模式,无论那种授权模式,其授权流程都是相似的,只不过在个别步骤上有差异而已。如上图所示。
授权码模式是OAuth2目前最安全最复杂的授权流程,先放一张图,稍做解释
如上图,我们可以看到此流程可大致分为三大部分
整体上来说,可以用一句话概括授权码模式授权流程,客户端换取授权码,客户端使用授权码换token,客户端使用token访问资源
接下来对这三部分进行一些说明 :
前提条件:
- 第三方客户端需要提前与资源拥有方(同时也是授权所有方)协商客户端id(client_id),客户端密钥(client_secret)
- 文中暂时未将scope、state等依赖具体框架的内容写进来,这里可以参考Spring Security OAuth2的实现
客户端换取授权码,这个客户端可以是浏览器,
1.客户端将
client_id + 授权模式标识(grant_type) + 回调地址(redirect_uri)
拼成url访问授权服务器授权端点
2.授权服务器返回登录界面,要求
用户登录
(此时用户提交的密码等直接发到授权服务器,进行校验)3.授权服务器返回授权审批界面,
用户授权
完成4.授权服务器
返回授权码到回调地址
客户端使用授权码换token
- 客户端接收到授权码,并使用
授权码 + client_id + client_secret
访问授权服务器颁发token端点- 授权服务器校验通过,颁发token返回给客户端
- 客户端保存token到存储器(推荐cookie)
客户端使用token访问资源
- 客户端在请求头中添加token,访问资源服务器
- 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
- 资源服务器校验成功,返回资源
这里的说明省去了一些参数,如scope(请求token的作用域)、state(用于保证请求不被CSRF)、redirect_uri(授权服务器回调uri),先理解概念,实现的时候再去要求
隐式授权模式大致可分为两部分:
用一句话概括隐式授权模式授权流程
客户端让用户登录授权服务器换token,客户端使用token访问资源
客户端让用户登录授权服务器换token
- 客户端(浏览器或单页应用)将
client_id + 授权模式标识(grant_type)+ 回调地址(redirect_uri)
拼成url访问授权服务器授权端点
- 授权服务器跳转用户登录界面,用户登录
- 用户授权
- 授权服务器
访问回调地址
返回token给客户端
客户端使用token访问资源
- 客户端在请求头中添加token,访问资源服务器
- 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
- 资源服务器校验成功,返回资源
密码模式大体上也分为两部分:
一句话概括用户名密码模式流程:
用户在客户端提交账号密码换token,客户端使用token访问资源
用户在客户端提交账号密码换token
- 客户端要求用户登录
- 用户输入密码,客户端将表单中添加客户端的client_id + client_secret发送给授权服务器
颁发token端点
- 授权服务器校验用户名、用户密码、client_id、client_secret,均通过返回token到客户端
- 客户端保存token
客户端使用token访问资源
- 客户端在请求头中添加token,访问资源服务器
- 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
- 资源服务器校验成功,返回资源
客户端模式大体上分为两部分:
一句话概括客户端模式授权流程:客户端使用自己的标识换token,客户端使用token访问资源
客户端使用自己的标识换token
- 客户端使用client_id + client_secret + 授权模式标识访问授权服务器的
颁发token端点
- 授权服务器校验通过返回token给客户端
- 客户端保存token
客户端使用token访问资源
- 客户端在请求头中添加token,访问资源服务器
- 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
- 资源服务器校验成功,返回资源
考虑到授权场景的多样性,可以参考以下两种选型方式
参考:https://blog.csdn.net/weixin_52834606/article/details/126995138
https://www.cnblogs.com/hellxz/p/oauth2_process.html
https://tools.ietf.org/html/rfc6749
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。