私はREST Webサービスの初心者で、最初のWebサービスを作成しました。
私のサービスでは、ユーザーは簡単なフォームを使用して、希望するユーザー名とパスワードを指定してプロファイルを作成できます。
次に、ユーザーがログインするときにユーザーの資格情報を確認する方法は??
ユーザーがログインしたことを検証する簡単なフォームがありますが、ユーザーが追加/更新/削除のさまざまなプロファイル操作を実行するときにユーザーを検証する方法は??
例えば:
FBでサインインすると、資格情報を含むCookieが保存され、「ステータスの投稿」などの操作を実行すると、友達にメッセージを送信します...など...資格情報を要求しなくなりますそれはあなたの資格情報がそこにあるクッキーを持っていて、それはただそのクッキーを使うからです...
しかし、RESTではCookieを使用しないため、次のオプションはHTTPヘッダーです。HTTPヘッダーを介してユーザー資格情報を送受信する方法を知りたいです。Basic HTTP Auth
クライアントサイド
資格情報を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)
メソッドをオーバーライドする必要があります。メソッド内では、基本的に次のことを行います。
javax.xml.bind.DatatypeConverter.parseBase64Binary()
を使用します)401 Unauthorized
_を返します(つまり、throw new WebApplicationException(Status.UNAUTHORIZED)
)this ブログ投稿で非常に良い例を見つけることができます。