MaxKey/docs/protocols/oauth2.md
shimingxy e51f4ffcfe U
2020-03-08 09:00:25 +08:00

5.2 KiB
Raw Blame History

1 什么是OAuth2

OAuth OAuth开放授权是一个开放标准允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。

OAuth2.0对于用户相关的OpenAPI例如获取用户信息动态同步照片日志分享等为了保护用户数据的安全和隐私第三方网站访问用户数据前都需要显式的向用户征求授权。

采用OAuth2.0标准协议来进行用户身份验证和获取用户授权相对于之前的OAuth1.0协议,其认证流程更简单和安全。

扩展阅读参看:OAuth标准英文 | OAuth维基百科中文

2 应用场景

第三方应用授权登录在APP或者网页接入一些第三方应用时时长会需要用户登录另一个合作平台比如QQ微博微信的授权登录。 <img src="{{ "/images/oauth2/qq.jpg" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>

原生app授权app登录请求后台接口为了安全认证所有请求都带token信息如果登录验证、请求后台数据。

前后端分离单页面应用spa前后端分离框架前端请求后台数据需要进行oauth2安全认证比如使用vue、react后者h5开发的app。

3 名词定义

1 Third-party application第三方应用程序本文中又称"客户端"client比如打开知乎使用第三方登录选择qq登录这时候知乎就是客户端。

2HTTP serviceHTTP服务提供商本文中简称"服务提供商"即上例的qq。

3Resource Owner资源所有者本文中又称"用户"user,即登录用户。

4User Agent用户代理本文中就是指浏览器。

5Authorization server认证服务器即服务提供商专门用来处理认证的服务器。

6Resource server资源服务器即服务提供商存放用户生成的资源的服务器。它与认证服务器可以是同一台服务器也可以是不同的服务器。

4 运行流程

<img src="{{ "/images/oauth2/flow.jpg" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>

A用户打开客户端以后客户端要求用户给予授权。

B用户同意给予客户端授权。

C客户端使用上一步获得的授权向认证服务器申请令牌。

D认证服务器对客户端进行认证以后确认无误同意发放令牌。

E客户端使用令牌向资源服务器申请获取资源。

F资源服务器确认令牌无误同意向客户端开放资源。

5 四种授权模式

授权码模式authorization code

简化模式implicit

密码模式resource owner password credentials

客户端模式client credentials

5.1 授权码模式

授权码模式authorization code是功能最完整、流程最严密的授权模式。 <img src="{{ "/images/oauth2/code.jpg" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>

1用户访问客户端后者将前者导向认证服务器假设用户给予授权认证服务器将用户导向客户端事先指定的"重定向URI"redirection URI同时附上一个授权码。

2客户端收到授权码附上早先的"重定向URI"向认证服务器申请令牌GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向页面链接。请求成功返回code授权码一般有效时间是10分钟。

3认证服务器核对了授权码和重定向URI确认无误后向客户端发送访问令牌access token和更新令牌refresh token。POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向页面链接。请求成功返回access Token和refresh Token。

5.2 简化模式Implicit

适用于公开的浏览器单页应用 <img src="{{ "/images/oauth2/implicit.jpg" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>

Access Token直接从授权服务器返回(只有前端渠道)

不支持refresh tokens

假定资源所有者和公开客户应用在同一个设备上

最容易受安全攻击

5.3 用户名密码 Resource Owner Credentials

使用用户名密码登录的应用例如桌面App

使用用户名/密码作为授权方式从授权服务器上获取access token

一般不支持refresh token

假定资源拥有者和公开客户子啊相同设备上

5.4 客户端凭证 Client Credentials

适用于服务器见通信场景,机密客户代表它自己或者一个用户

只有后端渠道使用客户凭证获取一个access token

因为客户凭证可以使用对称或者非对称加密,该方式支持共享密码或者证书