web-dev-qa-db-ja.com

REST Webサービス(Java + Jersey))で基本HTTP認証を使用する方法は?

私はREST Webサービスの初心者で、最初のWebサービスを作成しました。
私のサービスでは、ユーザーは簡単なフォームを使用して、希望するユーザー名とパスワードを指定してプロファイルを作成できます。

次に、ユーザーがログインするときにユーザーの資格情報を確認する方法は??
ユーザーがログインしたことを検証する簡単なフォームがありますが、ユーザーが追加/更新/削除のさまざまなプロファイル操作を実行するときにユーザーを検証する方法は??

例えば:
FBでサインインすると、資格情報を含むCookieが保存され、「ステータスの投稿」などの操作を実行すると、友達にメッセージを送信します...など...資格情報を要求しなくなりますそれはあなたの資格情報がそこにあるクッキーを持っていて、それはただそのクッキーを使うからです...

しかし、RESTではCookieを使用しないため、次のオプションはHTTPヘッダーです。HTTPヘッダーを介してユーザー資格情報を送受信する方法を知りたいです。
Basic HTTP Auth

13
user2416728

クライアントサイド

資格情報をAPIに送信するには、HTTP Authorizationヘッダーを使用して、資格情報を_Basic username:password_の形式で指定します。 username:password文字列は、 Base64 というエンコードスキームを使用してエンコードする必要があります。したがって、ヘッダーの例は次のようになります。

_Authorization: Basic d2lraTpwZWRpYQ==
_

残りの仕様では、クライアント/サーバー通信はステートレスである必要があると規定されているため、すべての要求で資格情報を含むヘッダーを含める必要があります。通常、クライアント側でセッションCookieを使用してユーザーを識別し、ユーザーがすべての要求で資格情報を入力する必要がないようにします。

サーバー側

ジャージーRESTサービス内の資格情報を確認するには、すべての着信リクエストをキャッチしてインターセプトする必要があります。ジャージーは、これを行うためにContainerRequestFiltersと呼ばれる概念を提供します。 Tomcatでは、次のようにweb.xmlのサーブレット定義内にこのタイプのフィルターを追加できます。

_<init-param>
    <param-name>com.Sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>your.package.BasicAuthFilter</param-value>
</init-param>
_

参照されるクラスBasicAuthFilterは、Jerseys ContainerRequestFilterインターフェースを実装し、public ContainerRequest filter(ContainerRequest request)メソッドをオーバーライドする必要があります。メソッド内では、基本的に次のことを行います。

  • リクエストのAuthorizationヘッダーからBase64でエンコードされた認証情報をフェッチします
  • それらをデコードします(つまり、javax.xml.bind.DatatypeConverter.parseBase64Binary()を使用します)
  • userDao(または他のデータソースプロバイダー)を使用して、資格情報が有効かどうかを確認します
  • 検証が失敗した場合は、ステータスコード_401 Unauthorized_を返します(つまり、throw new WebApplicationException(Status.UNAUTHORIZED)
  • 認証情報が有効な場合は、リクエストを返すだけで、リクエストの処理を担当するジャージーリソースに委任できます。

this ブログ投稿で非常に良い例を見つけることができます。

29
benjiman