• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

OAuth 2.0

互联网 diligentman 1周前 (11-21) 5次浏览

简介

第三方认证解决方案。用来获取令牌和使用令牌的协议,本身不处理用户信息。用来授权第三方应用,获取用户数据,而不需要将用户名、密码提供给第三方。

场景

第三方客户端访问用户的资源,需要向用户申请授权。用户同意后,资源给第三方客户端令牌(access token)。令牌的权限范围、有效期可控。

角色Roles

Resource Owner: User
资源resource的拥有者,授权给第三方应用来访问。这种授权有限制。
Resource Server/Authorization Server: API
资源服务器保存用户资源。授权服务器验证用户。
Client: Application
第三方应用。

协议示意

OAuth 2.0
整体流程

  1. The application requests authorization to access service resources from the user
  2. If the user authorized the request, the application receives an authorization grant
  3. The application requests an access token from the authorization server (API) by presenting authentication of its own identity, and the authorization grant
  4. 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.
  5. The application requests the resource from the resource server (API) and presents the access token for authentication
  6. 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)

含义:第三方客户端先申请一个授权码,然后再用该码获取令牌。
特点:功能最完善、流程最严密。通过客户端的后台服务器与服务提供商的认证服务器进行互动。授权码前端传送,令牌的存储和通信都在后端。
流程示意
OAuth 2.0
步骤
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)

含义:允许直接向前端颁发令牌,没有授权码步骤。
特点:纯前端应用,无后端。
流程示意
OAuth 2.0
步骤
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/…


程序员灯塔
转载请注明原文链接:https://www.wangt.cc/2020/11/oauth-2-0/
喜欢 (0)