知識庫 / Testing RSS 訂閱

REST Assured 認證

REST,Security,Testing
HongKong
3
03:50 AM · Dec 06 ,2025

1. 概述

本教程將分析如何使用 REST Assured 進行身份驗證,以正確地測試和驗證受保護的 API。

REST Assured 支持多種身份驗證方案:

  • 基本身份驗證 (Basic Authentication)
  • 摘要身份驗證 (Digest Authentication)
  • 表單身份驗證 (Form Authentication)
  • OAuth 1 和 OAuth 2

2. 使用基本身份驗證

基本身份驗證方案 要求消費者發送用户 ID 和 Base64 編碼的密碼。

REST Assured 提供了一種便捷的方式來配置請求所需的憑據:

given().auth()
  .basic("user1", "user1Pass")
  .when()
  .get("http://localhost:8080/spring-security-rest-basic-auth/api/foos/1")
  .then()
  .assertThat()
  .statusCode(HttpStatus.OK.value());

2.1. 預先身份驗證

正如我們在 Spring Security 身份驗證之前的帖子中所看到的,服務器可能會使用 挑戰-響應機制,明確指示消費者需要驗證才能訪問資源。

默認情況下,REST Assured 在等待服務器發出挑戰之前才發送憑據。

這在某些情況下可能令人困擾,例如,當服務器配置為檢索登錄表單而不是挑戰-響應機制時。

因此,該庫提供 preemptive 指令,我們可以使用它:

given().auth()
  .preemptive()
  .basic("user1", "user1Pass")
  .when()
  // ...

有了以上配置,REST Assured 將會發送憑據,無需等待 Unauthorized 響應。

我們很少關心測試服務器驗證能力。因此,我們通常可以添加此命令以避免不必要的複雜性和額外請求的開銷。

3. 使用 Digest 身份驗證

儘管這種方法也被認為是“弱”身份驗證方法,但使用 Digest 身份驗證在基本協議中具有優勢。

這是因為該方案避免了以明文方式發送密碼。

儘管存在這種差異,使用 REST Assured 實現這種身份驗證形式與我們在上一部分中遵循的方法非常相似:

given().auth()
  .digest("user1", "user1Pass")
  .when()
  // ...

請注意,目前該庫僅支持受限認證方案,因此我們不能使用preemptive(),就像我們之前所做的那樣。

4. 使用表單身份驗證

許多服務提供 HTML 表單,供用户通過填寫字段和憑據進行身份驗證。

當用户提交表單時,瀏覽器會執行一個帶有信息的 POST 請求。

通常,表單會指示其將調用哪個端點,通過其 action 屬性,並且每個 input 字段都對應於請求中發送的表單參數。

如果登錄表單足夠簡單並且遵循這些規則,那麼我們可以依賴 REST Assured 來自動確定這些值:

given().auth()
  .form("user1", "user1Pass")
  .when()
  // ...

這種方法並不理想,因為 REST Assured 需要執行額外的請求並解析 HTML 響應以查找字段。

此外,我們還需要考慮到該過程可能仍然失敗,例如,如果網頁過於複雜,或者服務配置的上下文路徑未包含在 action 屬性中。

因此,更好的解決方案是自己提供配置,明確指定三個所需字段:

given().auth()
  .form(
    "user1",
    "user1Pass",
    new FormAuthConfig("/perform_login", "username", "password"))
  // ...

除了這些基本配置之外,REST Assured 還自帶功能,可以:

  • 檢測或指示網頁中的 CSRF 令牌字段
  • 在請求中使用額外的表單字段
  • 記錄身份驗證過程的信息

5. OAuth 支持

OAuth 實際上是一個 授權 框架,它並不會定義任何用於驗證用户的方法。

儘管如此,它仍然可以作為構建身份驗證和身份協議的基礎,例如 OpenID Connect。

5.1 OAuth 2.0

REST Assured 允許配置 OAuth 2.0 訪問令牌,以便請求受保護的資源:

given().auth()
  .oauth2(accessToken)
  .when()
  .// ...

該庫不提供任何獲取訪問令牌的幫助,因此我們需要自己解決這個問題。

對於客户端憑據和密碼流,這很簡單,因為只需提供相應的憑據即可獲取令牌。

另一方面,自動化授權碼流可能並不容易,我們可能還需要藉助其他工具。

為了正確理解這個流程以及獲取訪問令牌所需的工作,我們可以參考這篇關於該主題的優秀文章。

5.2 OAuth 1.0a

在 OAuth 1.0a 的情況下,REST Assured 提供了一種接收 Consumer Key、Secret、Access Token 和 Token Secret 的方法,用於訪問受保護的資源:

given().accept(ContentType.JSON)
  .auth()
  .oauth(consumerKey, consumerSecret, accessToken, tokenSecret)
  // ...

該協議需要用户輸入,因此獲取最後兩個字段並非易事。

請注意,如果我們在使用 OAuth 2.0 功能且版本低於 2.5.0,或者使用 OAuth 1.0a 功能,則需要在我們的項目中添加 scribejava-apis 依賴項。

6. 結論

在本教程中,我們學習瞭如何使用 REST Assured 通過 REST API 進行身份驗證。

該庫簡化了幾乎任何身份驗證方案的實現過程。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.