2015-12-17 10 views
11

私のWebアプリケーションは、サーバー側に多くのAjax呼び出しで構成されています。RESTful APIs顧客が自分のサイトにログインするたびに、ログインページはサーバーからJWT(JSON Webトークン)トークンを取得し、クライアント側にcookieとして保存します。 (ブラウザに自動的に送信させる唯一の方法であり、HTML5 Web Storageよりも安全だと言われているので、Cookieとして保存することを選択します)。トークンにはトークンの有効期限を記述するフィールドがあります。 Ajaxコールごとに、トークンが認証のために送信されます。Ajaxコールのログイン有効期限を正常に処理する方法は?

クライアントが自分のページに長時間滞在している場合、トークンは期限切れになる可能性があります。クライアントは次のHTTP要求(REST呼び出しだけでなく)を行ったときにサーバーがそれを検出します。 servlet filterを使用してall HTTPリクエストを傍受し、有効期限のトークンを確認します。トークンが期限切れの場合、リダイレクトからログインページの応答が送信されます。

しかし、上記のアプローチについての問題があります:「優雅にクライアント側でリダイレクト・ツー・ログイン・ページ応答を処理する方法は?」 non-Ajaxについては

  • HTTPリクエストを発信し、私はリダイレクト・ツー・ログイン・ページの応答を処理し、自動的にページをジャンプさせるために、ブラウザに依存することができます。 Ajaxについては

  • は、HTTPリクエストを発し、私がリダイレクト・ツー・ログイン・ページの応答を検出し、imperativelyページジャンプを作るためにeach AJAX呼び出しのcompletion handlerに余分なロジックを追加する必要がありそうです。

まったく間違っていますか?

いくつかの参照文献:

JWT (JSON Web Token) automatic prolongation of expiration

Which authentication strategy should I use for my API?

Implicit & Explicit authentication

ADD 1:

ブラウザが302 redireを処理するようです透明にしてください。 おそらく、私はログインページに302リダイレクトを返すことができます。これは、ajax呼び出しやプレーンページ訪問のためのものです。私は後でやってみます。

hereより:

応答はHTTPリダイレクト(状態コード301、302、303又は 307)である場合(それは セキュリティまたは無限ループ注意事項に違反していない限り)、それは透明に従わなければなりません。その他のエラー( 401を含む)は、オブジェクトにそのエラーページを応答として使用させなければならない。

Catching 302 FOUND in JavaScript

How to manage a redirect request after a jQuery Ajax call

答えて

2

ええ、私はあなたが正しいと思います。

non-ajaxについては、リダイレクトを使用してサーブ側でハンドラを処理できます。

ajaxについては、ajaxの結果に応じてページを切り替えることができます。

9

まさにこの理由から、ウェブAPIは302 redirectで応答するべきではなく、トークンが期限切れになったときに401 unauthorizedで応答するべきです。

Webアプリケーションは、エージェントのようなブラウザで常に消費されることになるので、302という応答を返す必要があります。詳細については、my answer hereも参照してください。

+0

私は今までこれについて知らなかった。 HTTPの規約に従うようです。どうもありがとう! – smwikipedia

+1

ところで、これはWeb APIが302レスポンスを返してはならないと言っているわけではありません。リソースが実際に移動した場合は、301または302を返すのは問題ありません。しかし、Web API IMOの認証メカニズムを実装するためには使用しないでください。 – MvdD

+0

はい。 *フォームは関数に従います*。 – smwikipedia

2

302リダイレクトは、javascript(ajax)呼び出しでは機能しません。これは、javascript内から実際のブラウザではなく、新しいページを呼び出します。

エラーメッセージとそのエラーメッセージを表示しているjsonオブジェクトを返すのは、きちんとした解決策です。またはJavaScriptを使用して場所をログインページに変更する

1

一般的にセッションの有効期限を処理するにはGlobal Ajax Event Handlerを使用できます。

.ajaxError()をキャッチして、セッションが有効期限切れかどうかを確認し、それに応じて動作してください。

私は正直言ってこれを試していませんが、それは価値があります。

関連する問題