OAuth 2.0系列--- 授权服务器

Posted 82G

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OAuth 2.0系列--- 授权服务器相关的知识,希望对你有一定的参考价值。

本来打算这篇直接上代码的,但是在看书的过程中发现有很多理论性的东西需要深挖,所以接下来我会先依次介绍OAuth中的授权服务器、客户端、受保护资源这三大服务器具体要做的事情和细节,本篇先来说说授权服务器。

授权服务器在OAuth中主要有以下四个作用:

  • 管理已注册的客户端
  • 用户对客户端授权
  • 为获得授权的客户端颁发令牌
  • 颁发刷新令牌并响应令牌刷新请求

其中前两者由授权端点完成,后两者由令牌端点完成,如下图:

 

OAuth2之介绍及授权方式

OAuth2之介绍及授权方式

什么是OAuth2

OAuth2是一个关于授权(anthorization)的开放网络标准,是授权而不是认证,本身不能告诉你任何用户信息。OAuth2基于令牌Token的授权,在无需暴露用户密码的情况下,使应用能获取对用户数据有限的权限访问,让应用能够代表用户去访问用户的数据。

OAuth2主要角色

OAuth2主要包含4个角色,资源拥有者,客户端,授权服务器和资源服务器。

  • 客户端,可以是一个web或者无线app等,保存有效的客户凭证,向授权服务器申请访问令牌,向资源服务器访问用户受保护的资源
  • 资源服务器,是一个web站点或者web service api,用户受保护的资源保存的地方
  • 授权服务器,在客户端成功认证并授权之后,向客户端应用颁发access_token访问令牌
  • 资源拥有者,同意将某些资源给第三方应用,指定具体的访问细分权限作用域

OAuth2令牌类型

  • Authorization Code Token(授权码) 仅用于授权码方式,用户获取访问令牌和刷新令牌
  • Refresh Token(刷新令牌) 用于向授权服务器获取一个新的访问令牌
  • Access Token(访问令牌) 授权服务器给应用颁发向资源服务器获取受保护资源的访问令牌
  • Bearer Token 不管谁拿到Token都可以访问资源
  • Proof of Possession Token 可以校验客户端对Token有明确的拥有权

OAuth2 授权方式步骤

OAuth2 主要包含以下4种授权方式。

  • 授权码(authorization-code)
  • 隐藏式(implicit)
  • 密码式(password)
  • 客户端凭证(client credentials)

授权码模式授权

 +----------+
 | Resource |
 |   Owner  |
 |          |
 +----------+
      ^
      |
     (B)
 +----|-----+          Client Identifier      +---------------+
 |         -+----(A)-- & Redirection URI ---->|               |
 |  User-   |                                 | Authorization |
 |  Agent  -+----(B)-- User authenticates --->|     Server    |
 |          |                                 |               |
 |         -+----(C)-- Authorization Code ---<|               |
 +-|----|---+                                 +---------------+
   |    |                                         ^      v
  (A)  (C)                                        |      |
   |    |                                         |      |
   ^    v                                         |      |
 +---------+                                      |      |
 |         |>---(D)-- Authorization Code ---------‘      |
 |  Client |          & Redirection URI                  |
 |         |                                             |
 |         |<---(E)----- Access Token -------------------‘
 +---------+       (w/ Optional Refresh Token)

A) 用户代理(浏览器)将包含客户端标识符、请求的范围、本地状态和重定向URI定向到授权端点。
B) 资源拥有者通过用户代理对客户端的访问请求进行授权,授权服务器对通过用户代理(浏览器)对资源拥有者进行身份验证。
C) 假设资源拥有者授予访问权,授权服务器使用先前提供的重定向URI将用户代理(浏览器)重定向回客户端,同时附上一个授权码。
D) 客户端将授权码和重定向URI向授权服务器的令牌端点发送请求访问令牌。
E) 授权服务器对客户端进行身份验证,验证授权代码,并确保接收到的重定向URI与步骤C中用于重定向客户端的URI匹配。如果有效,授权服务器将访问令牌和(可选)刷新令牌进行响应。

隐藏模式授权

 +----------+
 | Resource |
 |  Owner   |
 |          |
 +----------+
      ^
      |
     (B)
 +----|-----+          Client Identifier     +---------------+
 |         -+----(A)-- & Redirection URI --->|               |
 |  User-   |                                | Authorization |
 |  Agent  -|----(B)-- User authenticates -->|     Server    |
 |          |                                |               |
 |          |<---(C)--- Redirection URI ----<|               |
 |          |          with Access Token     +---------------+
 |          |            in Fragment
 |          |                                +---------------+
 |          |----(D)--- Redirection URI ---->|   Web-Hosted  |
 |          |          without Fragment      |     Client    |
 |          |                                |    Resource   |
 |     (F)  |<---(E)------- Script ---------<|               |
 |          |                                +---------------+
 +-|--------+
   |    |
  (A)  (G) Access Token
   |    |
   ^    v
 +---------+
 |         |
 |  Client |
 |         |
 +---------+

A) 用户代理(浏览器)将包含客户端标识符、请求的范围、本地状态和重定向URI定向到授权端点。
B) 资源拥有者通过用户代理对客户端的访问请求进行授权,授权服务器对通过用户代理(浏览器)对资源拥有者进行身份验证。
C) 假设资源所有者授予访问权,则授权服务器使用前面提供的重定向URI将用户代理重定向回客户端。重定向URI包括URI片段中的访问令牌。
D) 用户代理遵循重定向指令,向Web托管的客户端资源发出请求。用户代理在本地保留片段信息。
E) Web托管的客户端资源返回能够访问完整重定向URI(包括用户代理保留的片段)的网页(通常是带有嵌入式脚本的HTML文档),并提取片段中包含的访问令牌(和其他参数)。
F) 用户代理在本地执行Web托管客户端资源提供的脚本,后者提取访问令牌。
G) 用户代理将访问令牌传递给客户端.

密码模式授权

 +----------+
 | Resource |
 |  Owner   |
 |          |
 +----------+
      v
      |    Resource Owner
     (A) Password Credentials
      |
      v
 +---------+                                  +---------------+
 |         |>--(B)---- Resource Owner ------->|               |
 |         |         Password Credentials     | Authorization |
 | Client  |                                  |     Server    |
 |         |<--(C)---- Access Token ---------<|               |
 |         |    (w/ Optional Refresh Token)   |               |
 +---------+                                  +---------------+

A) 资源拥有者向客户端输入密码
B) 客户端携带密码向授权服务器发送请求
C) 授权服务器验证通过后返回返回访问令牌,可同时选择性的返回刷新令牌

客户端凭证模式授权

 +---------+                                  +---------------+
 |         |                                  |               |
 |         |>--(A)- Client Authentication --->| Authorization |
 | Client  |                                  |     Server    |
 |         |<--(B)---- Access Token ---------<|               |
 |         |                                  |               |
 +---------+                                  +---------------+

A) 客户端携带客户端身份凭证向授权服务器发送请求
B) 授权服务器验证通过后返回访问令牌。

刷新令牌

 +--------+                                           +---------------+
 |        |--(A)------- Authorization Grant --------->|               |
 |        |                                           |               |
 |        |<-(B)----------- Access Token -------------|               |
 |        |               & Refresh Token             |               |
 |        |                                           |               |
 |        |                            +----------+   |               |
 |        |--(C)---- Access Token ---->|          |   |               |
 |        |                            |          |   |               |
 |        |<-(D)- Protected Resource --| Resource |   | Authorization |
 | Client |                            |  Server  |   |     Server    |
 |        |--(E)---- Access Token ---->|          |   |               |
 |        |                            |          |   |               |
 |        |<-(F)- Invalid Token Error -|          |   |               |
 |        |                            +----------+   |               |
 |        |                                           |               |
 |        |--(G)----------- Refresh Token ----------->|               |
 |        |                                           |               |
 |        |<-(H)----------- Access Token -------------|               |
 +--------+           & Optional Refresh Token        +---------------+

A) 客户端通过与授权服务器进行身份验证并提供授权码方式来请求访问令牌。
B) 授权服务器对客户端进行身份验证并验证授权授予,如果有效,则发出访问令牌和刷新令牌。
C) 客户端通过提供访问令牌向资源服务器发出受保护的资源请求。
D) 资源服务器验证访问令牌,如果有效,则为请求返回受保护的资源。
E) 客户端会使用访问令牌重复的向资源服务器发送请求。
F) 由于访问令牌无效,所以资源服务器返回无效的令牌错误。
G) 客户端通过与授权服务器进行身份验证并显示刷新令牌来请求新的访问令牌。客户端身份验证要求基于客户端类型和授权服务器策略。
H) 授权服务器对客户端进行身份验证并验证刷新令牌,如果有效,则发出一个新的访问令牌(以及可选的新刷新令牌)。

Oauth2授权方式选型

技术图片

参考文档

RFC6749
阮一峰-理解OAuth 2.0






















以上是关于OAuth 2.0系列--- 授权服务器的主要内容,如果未能解决你的问题,请参考以下文章

带密码授权的 DotNetOpenAuth OAuth 2.0 授权服务器

OAuth 2.0实现分布式认证授权-认证服务器配置

OAuth 2.0 代码授权流程

OAuth 2.0 授权认证详解

Postman-OAuth 2.0授权

通过第三方服务授权后,如何使用 OAuth 2.0 保持会话? [关闭]