`

[转]OAuth 2.0 筆記 (4.3) Resource Owner Password Credentials Grant Flow 細節

阅读更多

OAuth 2.0 筆記 (4.3) Resource Owner Password Credentials Grant Flow 細節

在 Resource Owner Password Credentials Grant Flow 流程裡, Resource Owner 自己的帳號密碼會直接用來當做 Authorization Grant ,並傳遞給 Authorization Server 來取得 Access Token 。這種流程只有在以下情況才能使用:

  • Resource Owner 高度信賴 Client ,例如作業系統內建的應用程式(好比說 OS X 的 Twitter 整合)或是官方應用程式。
  • 其他別的流程都不適用。

而就算 Client 可以直接拿到 Resource Owner 的帳號密碼,也只會使用一次,用來取得 Access Token 。Spec 裡面定義的流程,會要求 Client 不儲存帳號密碼,而是隨後以長時效的 Access Token 或 Refresh Token 取代之。

Authorization Server 應該要特別小心開放這種流程,並且要在別的流程都行不通的時候才使用這種。

這種流程適用於可以取得 Resource Owner 帳號密碼的 Client (通常是透過一個輸入框)。也可以用來把以前的帳號密碼認證,遷移到 OAuth 認證。

最後拿到的除了 Access Token 之外,還會拿到 Refresh Token (Authorization Server 有支援的話)。

這是 OAuth 2.0 內建的四個流程之一。本文整理自 Section 4.3。

流程圖

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

       Figure 5: Resource Owner Password Credentials Flow

(A) Resource Owner 向 Client 提供真正的帳號密碼。

(B) Client 用 Resource Owner 的帳號密碼,向 Authorization Server 的 Token Endpoint 申請 Access Token。這個時候 Client 還要向 Authorization Server 認證自己。

(C) Authorization Server 認證 Client 、驗證 Resource Owner 的帳號密碼,如果正確的話,核發 Access Token。

(A) Authorization Request & Response

在這個流程裡面, Authorization Grant 就是 Resource Owner 的帳號密碼,所以在 Step (A) 裡面直接向 Resource Onwer 索取,沒有經過網路來取得 Authorization。

Spec 不規定 Client 要怎麼拿到帳號密碼,但是 Client 取得 Access Token 之後,必須把 Resource Owner 的帳號密碼給銷毀掉。

(B) Access Token Request

【Client】POST ▶ 【Token Endpoint】

參數

參數名 必/選 填什麼/意義
grant_type password
username Resource Owner 的帳號
password Resource Owner 的密碼
scope 申請的存取範圍

Authorization Server 的處理程序

這個 Request 進來的時候, Authorization Server 要做這些事:

  1. 要求 Client 認證自己(如果是 Confidential Client 或有拿到 Client Credentials)
    • 如果 Client 有出示認證資料,就認證它,細節見系列文第 2 篇
    • 驗證 Resource Owner 的帳號密碼(以既有的驗證方式)

慎防暴力破解

因為牽涉到帳號密碼,所以 Authorization Server 要可以防 Endpoint 被暴力破解,具體實施的方法像是 Rate Limiting 或是發出警告。

範例

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=johndoe&password=A3ddj3w

(C) Access Token Response

(同 Authorization Code Grant Flow。)

【Client】 ◀ 【Token Endpoint】

若 Access Token Request 合法且有經過授權,則核發 Access Token,同時可以核發 Refresh Token (非必備)。如果 Client 認證失敗,或 Request 不合法,則依照 Section 5.2 的規定回覆錯誤。

詳細核發 Access Token 的細節寫在系列文第 5 篇

範例

發給 Access Token:

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"2YotnFZFEjr1zCsicMWpAA",
  "token_type":"example",
  "expires_in":3600,
  "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
  "example_parameter":"example_value"
}

安全性問題 (Section 10.7)

帳號密碼外洩

Resource Owner Password Credentials Grant Type 通常是用在老舊 Client ,或是遷移舊的認證機制到 OAuth。雖然這種流程降低了在 Client 裡面儲存帳號密碼所引來的風險,但是沒有消除把帳號密碼給 Client 看的必要性。(編按:第一步還是需要 Resonrce Owner 提供帳號密碼)

這個流程的風險比起其他流程還要高,因為它保留了使用密碼的 anti-pattern,而這個卻是 OAuth spec 致力避免的。Client 可能會濫用密碼,或是密碼會不經意地洩漏給壞人(例如 Log 或是其他 Client 保存的記錄)。

Resource Owner 無法控制授權權限與存取範圍

此外,因為 Resource Owner 沒辦法控制授權的流程(Resource Owner 只參與到輸入帳號密碼),Client 可以取得比 Resource Owner 期望的權限 (scopes) 還要更多的權限。Authorization Server 在透過這種流程合法 Access Token 的時候應該要慎重考慮 scope 和時效的問題。

Authorization Server 和 Client 應該要儘量不使用這種流程,改用其他流程。

转自:https://blog.yorkxin.org/2013/09/30/oauth2-4-3-resource-owner-credentials-grant-flow

 

分享到:
评论

相关推荐

    OAuth2.0 密码模式实现

    在服务端,基于 Owin OAuth, 针对 Resource Owner Password Credentials Grant 的授权方式,只需重载 OAuthAuthorizationServerProvider.GrantResourceOwnerCredentials() 方法即可

    Spring Security OAuth2.0学习笔记.zip

    Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...

    完整Oauth 2.0实现实例

    OAuth 2.0 主要分为四个角色:资源所有者(Resource Owner)、客户端(Client)、授权服务器(Authorization Server)和资源服务器(Resource Server)。资源所有者是拥有数据的用户,客户端是请求访问这些资源的...

    OAuth2.0协议中文版

    OAuth 2.0 协议中文译本共分为九大部分,分别介绍了 OAuth 2.0 协议的背景知识、术语中英对照表、OAuth 2.0 协议的中文译本、OAuth 2.0 协议的工作流程、OAuth 2.0 协议的安全机制、OAuth 2.0 协议的优点、OAuth 2.0...

    springboot集成oauth2.0

    SpringBoot集成OAuth2.0是将流行的OAuth2.0安全框架与SpringBoot应用程序相结合的过程,以便为API和Web应用提供安全的访问控制。OAuth2.0是一个授权框架,允许第三方应用在用户授权的情况下访问其受保护的资源,而...

    OAuth2.0协议原理与实现

    ### OAuth2.0协议原理与实现 #### 一、OAuth2.0协议概述 OAuth2.0协议是一种广泛应用于第三方登录及授权的标准协议。相比于OAuth1.0版本,OAuth2.0进行了多方面的优化和改进,例如简化了授权流程、取消了Token的...

    Java的oauth2.0 服务端与客户端的实现(源码)

    - **Resource Owner Password Credentials Grant**:一种授权类型,允许用户直接提供用户名和密码来获取令牌。 - **Authorization Code Grant**:另一种常见的授权方式,涉及授权码的交换。 - **Client Registration...

    cas3.5.0集成oauth2.0协议

    **OAuth2.0协议概述** OAuth2.0是一种授权框架,允许第三方应用在用户许可的情况下,访问特定资源。它主要用于安全地实现用户数据的共享,比如社交媒体登录、云存储服务等。OAuth2.0的核心是将用户的授权过程与实际...

    Oauth2.0 协议 服务端 客户端 thinkphp5.0

    首先,OAuth2.0协议主要包括四个角色:资源所有者(Resource Owner)、客户端(Client)、资源服务器(Resource Server)和授权服务器(Authorization Server)。在服务端授权码模式下,客户端通过引导用户访问授权...

    webapi基于Owin中间件的oauth2.0身份认证

    **OAuth2.0简介** OAuth2.0是一种授权框架,广泛应用于Web API的身份验证和授权。它允许第三方应用在用户授权的情况下,访问该用户的特定资源,而无需获取用户的用户名和密码。OAuth2.0的核心是将认证和授权分离,...

    微信oauth2.0授权

    微信OAuth2.0授权是一种广泛应用于移动应用和网站的第三方登录解决方案,主要目的是为了安全地获取用户的微信身份标识——openid,以便提供个性化服务或者与其他微信功能集成。在本文中,我们将详细探讨微信OAuth2.0...

    基于Django2.1.2的OAuth2.0授权登录

    **基于Django 2.1.2的OAuth2.0授权登录详解** OAuth2.0是一种开放标准,用于授权第三方应用访问用户存储在另一服务提供商(如社交媒体网站)上的私有资源,而无需共享用户的登录凭证。在Django框架中实现OAuth2.0...

    OAuth2.0安全案例回顾

    OAuth2.0支持多种授权模式,包括但不限于Authorization Code Grant、Implicit Grant、Resource Owner Password Credentials Grant等。这些授权模式的设计初衷是为了适应不同的应用场景,但在实践中,这种多样性反而...

    OAuth2.0中文译本和授权框架等3本.zip

    OAuth 2.0 是一种广泛使用的开放网络授权协议,它允许第三方应用...总之,OAuth 2.0 为互联网应用提供了安全的数据共享机制,这些文档可以帮助开发者深入理解协议的细节,确保安全、合规地使用OAuth 2.0进行应用开发。

    c# OAuth2.0

    1. **授权码 Grant Type**:OAuth2.0中最常见的授权类型,它引导用户在服务提供商(如QQ或新浪)上进行登录并同意授权。用户授权后,服务提供商返回一个授权码,这个授权码用于换取访问令牌。 2. **客户端(Client...

    java实现oauth2.0服务端+客户端(含JWT)

    首先,OAuth 2.0的核心概念包括四个角色:资源所有者(Resource Owner)、客户端(Client)、资源服务器(Resource Server)和授权服务器(Authorization Server)。资源所有者是拥有数据的用户,客户端是请求访问...

    OAuth2.0代码模拟实现

    OAuth2.0是一种广泛使用的授权框架,用于在第三方应用与用户资源之间建立安全的数据共享机制。这个框架允许用户授权第三方应用访问他们存储在特定服务提供商(如Google或Facebook)上的数据,而无需分享他们的登录...

    OAuth2.0协议中文版.pdf

    OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 1.0(即完全废止了OAuth1.0)。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用...

Global site tag (gtag.js) - Google Analytics