10

私はPlay2!Scalaのドキュメントを掘り下げて、ユーザーリクエストの認証/承認を実装する方法について調べてきましたが、少し迷っています。モバイルデバイスから送信されたリクエストがPlay2!ScalaでバックアップされたRESTサービスでどのように認証/承認されるかについて詳しく知りたいです。

まず第一に、Play2 /scalaには多くのauth-modulesがあるようです:例えばt2vのPlay20-auth。ただし、これらのソリューションは、クライアント側にCookieを保存することに基づいています。そうですか?これは純粋なWebの観点からは理にかなっています。リクエストはブラウザから送信され、サーバーはクライアントにCookieを保存できます。

ここで、ネイティブモバイルアプリケーション(IOSまたはAndroid上)があり、Play2!Scalaアプリに基づくRESTサービスを呼び出している場合はどうなりますか。この場合、私はブラウザを使用していないため、サーバーはクライアントアプリにCookieを保存できません。

承認/認証にt2vのPlay20-authなどのモジュールを引き続き使用できますか?

この種のことに対処するためのベストプラクティスは何ですか?

どんな助けでも本当にありがたいです、事前に感謝します、

4

1 に答える 1

9

わかりました、これは認証用です。ログインは別です。独自のシステムまたはopenIDなどを使用できます。問題は、ユーザーが認証されたことをどのように保存するかです。

RESTサービスを保護するための主なアイデアは、サーバー側でユーザーの識別子を使用して署名された認証トークンを使用することです。それはこのようになります:

  1. ユーザーがID/パスワードを入力します
  2. restメソッドはこれをチェックし、有効な場合はトークンを電話に送り返します。あなたはそれをあなたのアプリに保存します
  3. Rest APIを呼び出すたびに、ユーザーIDとトークンを送信し、サーバーでトークンを確認します。

トークンを生成およびチェックするための2つのソリューションがあります。

  1. トークンは基本的にユーザーIDであり、独自のソルト(必要な秘密メッセージ)と連結され、サーバー上の秘密鍵で署名されます。個人的には、HMAC-SHA256を使用してこれを実行しました(scalaコードでjavax.cryptoを使用)。誰かがあなたのRESTAPIを使おうとすると、彼らはあなたの秘密鍵も秘密も知らないので、トークンを生成することができません。REST API(3)でリクエストを受信するたびに、ハッシュを再計算して、トークンとして送信されたものと比較するだけです。
  2. ユーザーIDを持つHMACの代わりに、別の解決策は、ユーザーごとにデータベースに乱数を格納することです。これがあなたのトークンになります。リクエストを受信するたびに、そのユーザーのシークレットトークンをデータベースにチェックインし、クエリのトークンと同じかどうかを確認します。

これにより無限のトークンが作成されるため、ユーザーがログアウトすることはありません。これらのソリューションに有効期限を非常に簡単に追加できます。

  1. HMACを使用している場合は、(署名する前に)現在の日付をトークンに入れます。たとえば、24時間のセッションが必要な場合は、次のようにすることができます。

    val format = new SimpleDateFormat("d/M/yyyy");  
    isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));  
    val date = format.format(new Date());  
    val token = calculateHMAC(userID + date + secret);  
    

    短い/長い期間の場合は、フォーマットを変更して多かれ少なかれ含めるようにし、トークンを生成してチェックするたびに同じ期間に入るようにします。

  2. 乱数/データベースソリューションの場合、ランダムトークンの作成日を保存するだけで、希望する期間内にあるかどうかを確認できます。

サードパーティからのOpenID(または同様の)IDを使用している場合は、openIDプロバイダーのページをロードするユーザーにWebViewを表示する必要があります。認証後のリダイレクトページに、生成されたものが含まれていることを確認する必要があります。トークンをどこかに隠し(たとえばタイトル内)、アプリコードで抽出します。

これは自分で実装するのは非常に簡単ですが、トークン認証を処理するためのplay2のプラグイン: https ://github.com/orefalo/play2-authenticitytoken (個人的に使用されることはありません)とステートレス認証用のプラグイン: https:// github.com/blendlabs/play20-stateless-auth

logginビットについては、それを実装する必要はありません。プレイに適したモジュールがあります。

于 2012-08-27T18:58:06.417 に答える