1. 概要

このチュートリアルでは、 REST Assured で認証して、セキュリティで保護されたAPIを適切にテストおよび検証する方法を分析します。

このツールは、いくつかの認証スキームのサポートを提供します

  • 基本認証
  • ダイジェスト認証
  • フォーム認証
  • OAuth1とOAuth2

そして、それぞれの例を見ていきます。

2. 基本認証の使用

基本認証スキームでは、コンシューマーがBase64でエンコードされたユーザーIDとパスワードを送信する必要があります。

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セキュリティ認証に関する以前の投稿で見たように、サーバーはチャレンジ/レスポンスメカニズムを使用して、コンシューマーがリソースにアクセスするために認証が必要な時期を明示的に示す場合があります。

デフォルトでは、REST Assuredは、サーバーがチャレンジするのを待ってから資格情報を送信します。

これは、サーバーがチャレンジレスポンスではなくログインフォームを取得するように構成されている場合など、問題になる可能性があります。

このため、ライブラリは、使用できるプリエンプティブディレクティブを提供します。

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

これが適切な場合、REST Assuredは、Unauthorized応答を待たずに資格情報を送信します。

サーバーのチャレンジ能力をテストすることにほとんど関心がありません。したがって、通常、このコマンドを追加して、複雑さや追加のリクエストを行うオーバーヘッドを回避できます。

3. ダイジェスト認証の使用

これも「弱い」認証方法と見なされますが、ダイジェスト認証を使用すると、基本プロトコルよりも優れています。

これは、このスキームがパスワードをクリアテキストで送信することを回避するという事実によるものです。

この違いにもかかわらず、REST Assuredを使用したこの形式の認証の実装は、前のセクションで行ったものと非常によく似ています。

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

現在、ライブラリはこのスキームのチャレンジ認証のみをサポートしていることに注意してください。そのため、以前のようにpreemptive()を使用することはできません。

4. フォーム認証の使用

多くのサービスは、ユーザーがフィールドに資格情報を入力して認証するためのHTMLフォームを提供します。

ユーザーがフォームを送信すると、ブラウザはその情報を使用してPOSTリクエストを実行します。

通常、フォームは action 属性を使用して呼び出すエンドポイントを示し、各入力フィールドはリクエストで送信されるフォームパラメーターに対応します。

ログインフォームが十分に単純で、これらのルールに従っている場合は、RESTAssuredを使用してこれらの値を把握できます。

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

とにかく、これは最適なアプローチではありません。RESTAssuredは追加のリクエストを実行し、HTML応答を解析してフィールドを見つける必要があるためです。

また、Webページが複雑な場合や、サービスが action 属性に含まれていないコンテキストパスで構成されている場合など、プロセスが失敗する可能性があることにも注意する必要があります。

したがって、より良い解決策は、構成を自分で提供し、次の3つの必須フィールドを明示的に示すことです。

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

これらの基本構成とは別に、RESTAssuredには次の機能が付属しています。

  • WebページのCSRFトークンフィールドを検出または示す
  • リクエストで追加のフォームフィールドを使用する
  • 認証プロセスに関するログ情報

5. OAuthサポート

OAuthは技術的にはauthorizationフレームワークであり、ユーザーを認証するためのメカニズムを定義していません。

それでも、 OpenID Connect の場合のように、認証およびIDプロトコルを構築するための基礎として使用できます。

5.1. OAuth 2.0

REST Assuredを使用すると、OAuth2.0アクセストークンを構成してセキュリティで保護されたリソースを要求できます。

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

ライブラリはアクセストークンを取得するのに何の助けも提供しないので、これを自分で行う方法を理解する必要があります。

クライアントの資格情報とパスワードのフローの場合、トークンは対応する資格情報を提示するだけで取得されるため、これは簡単な作業です。

一方、認証コードフローの自動化はそれほど簡単ではない可能性があり、おそらく他のツールの助けも必要になるでしょう。

このフローとアクセストークンを取得するために必要なことを正しく理解するために、このテーマに関するこのすばらしい投稿を見ることができます。

5.2. OAuth 1.0a

OAuth 1.0aの場合、 REST Assuredは、保護されたリソースにアクセスするために、コンシューマーキー、シークレット、アクセストークン、およびトークンシークレットを受け取るメソッドを提供します。

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

このプロトコルはユーザー入力を必要とするため、最後の2つのフィールドを取得することは簡単な作業ではありません。

2.5.0より前のバージョンでOAuth2.0機能を使用している場合、またはOAuth 1.0を使用している場合は、プロジェクトにscribejava-apis依存関係を追加する必要があることに注意してください。機能。

6. 結論

このチュートリアルでは、RESTAssuredを使用してセキュリティで保護されたAPIにアクセスするために認証する方法を学習しました。

ライブラリは、実装した実質的にすべてのスキームの認証プロセスを簡素化します。

いつものように、Githubリポジトリの手順で実際の例を見つけることができます。