简介
第三方认证解决方案。用来获取令牌和使用令牌的协议,本身不处理用户信息。用来授权第三方应用,获取用户数据,而不需要将用户名、密码提供给第三方。
场景
第三方客户端访问用户的资源,需要向用户申请授权。用户同意后,资源给第三方客户端令牌(access token)。令牌的权限范围、有效期可控。
角色Roles
Resource Owner: User
资源resource的拥有者,授权给第三方应用来访问。这种授权有限制。
Resource Server/Authorization Server: API
资源服务器保存用户资源。授权服务器验证用户。
Client: Application
第三方应用。
协议示意
- The application requests authorization to access service resources from the user
- If the user authorized the request, the application receives an authorization grant
- The application requests an access token from the authorization server (API) by presenting authentication of its own identity, and the authorization grant
- If the application identity is authenticated and the authorization grant is valid, the authorization server (API) issues an access token to the application. Authorization is complete.
- The application requests the resource from the resource server (API) and presents the access token for authentication
- If the access token is valid, the resource server (API) serves the resource to the application
第三方管理
在资源系统(Authorization Server)申请注册,会生成客户端凭证:客户端标识符(client identifier/client ID)、客户端秘钥(client secret)。
授权方式
一、授权码模式(authorization code)
含义:第三方客户端先申请一个授权码,然后再用该码获取令牌。
特点:功能最完善、流程最严密。通过客户端的后台服务器与服务提供商的认证服务器进行互动。授权码前端传送,令牌的存储和通信都在后端。
流程示意
步骤
1.B提供一个授权请求链接(A的授权接口拼接参数),用户点击后会跳转到A。(toA:response_type=code, client_id, redirect_uri, scope=read)
2.跳转到A后,要求用户登录A,并且询问提示用户授权数据给B使用。若用户同意,跳转会指定地址且传回一个授权码。(jump to redirect_uri?code=AUTHORIZATION_CODE)
3.B拿到授权码后,在后端向A请求令牌。(toA: client_id、client_secret、grant_type=AUTHORIZATION_CODE、code、redirect_uri)
4.收到请求后颁发令牌。向redirect_uri发送数据,其中包含令牌。(jump to redirect_uri)。返回数据(access_token, token_type, expires, refresh_token, scope)。
二、隐式模式(implicit)
含义:允许直接向前端颁发令牌,没有授权码步骤。
特点:纯前端应用,无后端。
流程示意
步骤
1.B提供一个链接,用户点击后跳转到A。(response_type=token, client_id, redirect_uri, scop)
2.跳转到A后,要求用户登录,并且询问提示用户授权数据给B使用。用户同意,将令牌传回。(redirect_uri, token=ACCESS_TOKEN)
令牌位置是url锚点(fragment, #)不会发送到服务器。
3.应用获取到token后,请求时带上。
三、密码模式(resource owner password credentials)
含义:高度信任,允许把用户名和密码告诉第三方应用,用来申请令牌。
特点:用户高度信任的引用。
步骤
1.A要求用户提供B的用户名和密码。拿到后向B请求令牌。(grant_type=password, username, password, client_id)
2.B验证身份通过后,直接给出令牌。放在json数据中返回。
四、客户端模式(client credentials)
含义:获取第三方服务自己的数据(非用户数据)。
特点:后端/命令行申请。
步骤
1.B在命令行向A发出请求。(grant_type=client_credentials, clent_id, client_secret)
2.A验证通过后,返回令牌。
令牌的使用
B拿到令牌后,就可以向A请求数据。在每个发出的api请求,都需要带有令牌。
请求HEADER头信息增加 Authorization 字段。
自动更新令牌
A颁发令牌时,下发两个令牌,一个用户获取数据,一个用于获取新的令牌。
刷新令牌(grant_type=refresh_token, client_id, cliient_secret, refresh_token=REFERSH_TOKEN)
source:
https://www.ruanyifeng.com/bl...
http://www.ruanyifeng.com/blo...
https://www.digitalocean.com/...