在这里插入代码片
## 1.Oauth2
1.1 什么是Oauth2
开放授权(Open Authorization, Oauth)是一种用户授权第三方服务来控制访问另一个站点服务资源的协议。在整个授权过程中,第三方应用都无法触及到用户的密码就可以取得资源访问资源。目前Oauth 1.0版本基本因安全问题已基本不使用,后续介绍皆以Oauth 2.0版本为准。
oauth2能解决的问题:在用户不给客户端提供账号密码情况下,让第三方应用获取用户数据和基本信息难题。
1.2 名词定义
Client 客户端:第三方应用程序,用户需要进行访问的平台
Authorization Server 授权服务器:用于对客户端进行授权的服务器
Resouce Server 资源服务器,即用于发放资源的服务器。通常与授权服务在同一台机器,也可是不同服务器
Resource Owner 资源所有者,一般指用户
User-Agent 用户代理:指浏览器
1.3 Oauth2思路及流程
1.3.1 Oauth2核心思路
用户访问第三方应用,无需输入账户密码即可通过授权应用获取一定资源权限的授权令牌token。在有效期内, 客户端可以执此令牌在有效期内可对资源进行访问。
曾看过一位博主写的了一个很好的例子:驻场人员需要在甲方公司驻场开发,甲方公司员工需要带工牌,值岗人员只允许带工牌的人进入。 如何标识驻场人员身份并与甲方员工区分开来(甲方员工带蓝牌,驻场人员带黄牌,不同颜色工牌权限不一致)。此时需要向公司物业申请派发黄色工牌(令牌token),在有效期内,驻场员工携带该令牌通过闸机进入公司。
以上例子,授权服务器和资源服务器都归属于物业,客户端为闸机。
1.3.2 Oauth2授权流程
1.4 授权方式
Oauth2支持四种授权模式。分别是授权码模式、简易模式、账户密码模式和客户端模式,其中最常用的模式为授权码模式。
1.4.1 授权码模式
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。
流程图如下:
详细步骤如下:
1-2.用户访问客户端,后者将前者导向授权服务器
3.用户决定是否对其进行授权
4-5.授权服务器将事先定义好的客户端标识和回调地址与传递过来的参数进行对比,防止非法客户端请求授权
6.授权服务器校验通过后,将生成的授权码拼接在回调地址上
7.客户端通过code请求授权服务器(每个code只能使用一次)
8.授权服务器校验code有效性,校验通过后生成Access Token
9.客户端使用token请求资源服务器,获取权限列表等基本信息
10.资源服务器校验token合法性,返回用户所属资源列表
以上步骤中,共有三处交互(以下为标准化接口,授权平台可自定义)
申请授权码:/oauth/authorize?redirectUrl=https://example.com&client_id=abc&state=wjsnev&responseType=code
通过授权码获取token:/oauth/token?client_id=abc&authorization_code=1jmk5e&client_secret=xxx&grant=authorization_code&redirect_url=https://example.com
access token获取用户资源:授权平台自定义接口
个人在学习授权码模式中,有如下疑问:
1.为什么授权服务器不直接返回token,而是先返回code后置换token呢? 那直接返回code是否安全?
针对第一点疑问,直接返回code是安全的。因为oauth2协议是做了特殊处理的,同一个code只能被消费一次,当一个code使用了两次时,会将code此前发放的token都进行回收。另一方面每个客户端都会分配client_secrect,即攻击者拿到了code也无法正确访问资源。
直接返回token,token直接显示在浏览器上这是十分不安全的。因为access token是第三方后台直接与授权服务进行交互,所以是安全的。
Oauth2安全防护
1.4.2 简化模式Implicit Type
简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤.
1.4.3 密码模式
1.4.4 客户端模式
客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。
2.SSO
SSO(Single Sign On)单点登录,一端登录,多端无需登录。譬如淘宝,天猫,京东拥有众多子产品,在如此多产品情况下,每次都需要进行注册登录,诚然这是不现实的 ,此时就需要单点登录。
单点登录是离不开Oauth2的,oauth2仅仅是用与申请授权,而单点登录还需要认证操作。
认证:需要知道你是谁?何种角色
授权:你能够操作的资源有哪些?
SSO流程: