REST保証認証

  • REST

  • link:/category/security-2/ [セキュリティ]

  • link:/category/testing/ [テスト]

1. 概要

このチュートリアルでは、https://www.baeldung.com/rest-assured-tutorial [REST Assured]を使用して認証を行い、保護されたAPIを適切にテストおよび検証する方法を分析します。
*このツールはいくつかの認証スキームをサポートしています*:
  • 基本認証

  • ダイジェスト認証

  • フォーム認証

  • OAuth 1およびOAuth 2

    そして、それぞれの例が表示されます。

2. 基本認証の使用

https://tools.ietf.org/html/rfc7617 [基本認証スキーム]は、_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. 先制認証

link:/spring-security-basic-authentication#usage[Spring Security認証に関する以前の投稿]で見たように、サーバーはhttps://tools.ietf.org/htmlを使用するかもしれません/rfc2617#section-1.2 [チャレンジ/レスポンスメカニズム]は、リソースにアクセスするためにコンシューマが認証を必要とする時期を明示的に示します。
*デフォルトでは、REST Assuredは資格情報を送信する前にサーバーがチャレンジするのを待ちます。*
これは、たとえば、チャレンジレスポンスの代わりにログインフォームを取得するようにサーバーが構成されている場合など、面倒な場合があります。
このため、ライブラリは、使用できる__preemptive __directiveを提供します。
given().auth()
  .preemptive()
  .basic("user1", "user1Pass")
  .when()
  // ...
これを設定すると、REST Assuredは_Unauthorized_応答を待たずに資格情報を送信します。
サーバーのチャレンジ能力をテストすることにほとんど興味がありません。 *したがって、通常はこのコマンドを追加して、複雑さや追加のリクエストを行うオーバーヘッドを回避できます。*

3. ダイジェスト認証を使用する

これもhttps://tools.ietf.org/html/rfc2617#section-4.4 [「弱い」認証方法]と見なされますが、https://tools.ietf.org/html/rfc7616 [Digest Authentication]を使用します基本プロトコルよりも有利です。
これは、このスキームがクリアテキストでのパスワード送信を回避するという事実によるものです。
*この違いにもかかわらず、この形式の認証をREST Assuredで実装することは、前のセクションで従ったものと非常に似ています:*
given().auth()
  .digest("user1", "user1Pass")
  .when()
  // ...
現在、ライブラリはこのスキームのチャレンジド認証のみをサポートしていることに注意してください。

4. フォーム認証を使用する

多くのサービスは、ユーザーの資格情報をフィールドに入力して認証するためのHTMLフォームを提供します。
ユーザーがフォームを送信すると、ブラウザは情報を使用してPOSTリクエストを実行します。
通常、フォームはその_action_属性で呼び出すエンドポイントを示し、各_input_フィールドはリクエストで送信されるフォームパラメーターに対応します。
ログインフォームが非常にシンプルで、これらのルールに従っている場合、REST Assuredを使用してこれらの値を算出できます。
given().auth()
  .form("user1", "user1Pass")
  .when()
  // ...
とにかく、これは最適なアプローチではありません。RESTAssuredは追加のリクエストを実行し、HTMLレスポンスを解析してフィールドを見つける必要があるためです。
また、Webページが複雑な場合、または_action_属性に含まれていないコンテキストパスでサービスが構成されている場合など、プロセスが失敗する可能性があることにも留意する必要があります。
*したがって、より良い解決策は、3つの必須フィールドを明示的に示す構成を自分で提供することです。*
given().auth()
  .form(
    "user1",
    "user1Pass",
    new FormAuthConfig("/perform_login", "username", "password"))
  // ...
これらの基本構成とは別に、REST Assuredには次の機能が含まれています。
  • WebページのCSRFトークンフィールドを検出または示す

  • リクエストで追加のフォームフィールドを使用する

  • 認証プロセスに関するログ情報

5. OAuthサポート

OAuthは技術的には_authorization_フレームワークであり、ユーザーを認証するメカニズムを定義していません。
それでも、https://www.baeldung.com/spring-security-openid-connect [OpenID Connect]の場合のように、認証およびIDプロトコルを構築するための基礎として使用できます。

5.1. OAuth 2.0

  • REST Assuredでは、セキュリティで保護されたリソースを要求するためにOAuth 2.0アクセストークンを構成できます。*

given().auth()
  .oauth2(accessToken)
  .when()
  .// ...
ライブラリはアクセストークンを取得するためのヘルプを提供しないため、これを自分で行う方法を理解する必要があります。
クライアントクレデンシャルおよびパスワードフローの場合、トークンは対応するクレデンシャルを提示するだけで取得されるため、これは簡単なタスクです。
一方、認証コードフローの自動化はそれほど簡単ではない場合があり、おそらく他のツールの助けも必要になるでしょう。
このフローとlink:/spring-security-oauth-authorization-code-flow [アクセストークンを取得する]を正しく理解するには、このテーマに関するこのすばらしい投稿をご覧ください。 ]

5.2. OAuth 1.0a

OAuth 1.0aの場合、* REST Assuredは、コンシューマキー、シークレット、アクセストークン、およびトークンシークレット*を受け取り、保護されたリソースにアクセスするメソッドを提供します。
given().accept(ContentType.JSON)
  .auth()
  .oauth(consumerKey, consumerSecret, accessToken, tokenSecret)
  // ...
このプロトコルにはユーザー入力が必要なため、最後の2つのフィールドを取得するのは簡単な作業ではありません。
2.5.0より前のバージョンでOAuth 2.0機能を使用している場合、またはOAuth 1.0a機能を使用している場合は、プロジェクトにscribejava-apis依存関係を追加する必要があることに注意してください。

6. 結論

このチュートリアルでは、REST Assuredを使用して保護されたAPIにアクセスするための認証方法を学びました。
このライブラリは、私たちが実装したあらゆるスキームの認証プロセスを簡素化します。
いつものように、https://github.com/eugenp/tutorials/tree/master/testing-modules/rest-assured [our Github repo]の手順で実用的な例を見つけることができます。