わかりました、これは認証用です。ログインは別です。独自のシステムまたはopenIDなどを使用できます。問題は、ユーザーが認証されたことをどのように保存するかです。
RESTサービスを保護するための主なアイデアは、サーバー側でユーザーの識別子を使用して署名された認証トークンを使用することです。それはこのようになります:
- ユーザーがID/パスワードを入力します
- restメソッドはこれをチェックし、有効な場合はトークンを電話に送り返します。あなたはそれをあなたのアプリに保存します
- Rest APIを呼び出すたびに、ユーザーIDとトークンを送信し、サーバーでトークンを確認します。
トークンを生成およびチェックするための2つのソリューションがあります。
- トークンは基本的にユーザーIDであり、独自のソルト(必要な秘密メッセージ)と連結され、サーバー上の秘密鍵で署名されます。個人的には、HMAC-SHA256を使用してこれを実行しました(scalaコードでjavax.cryptoを使用)。誰かがあなたのRESTAPIを使おうとすると、彼らはあなたの秘密鍵も秘密も知らないので、トークンを生成することができません。REST API(3)でリクエストを受信するたびに、ハッシュを再計算して、トークンとして送信されたものと比較するだけです。
- ユーザーIDを持つHMACの代わりに、別の解決策は、ユーザーごとにデータベースに乱数を格納することです。これがあなたのトークンになります。リクエストを受信するたびに、そのユーザーのシークレットトークンをデータベースにチェックインし、クエリのトークンと同じかどうかを確認します。
これにより無限のトークンが作成されるため、ユーザーがログアウトすることはありません。これらのソリューションに有効期限を非常に簡単に追加できます。
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);
短い/長い期間の場合は、フォーマットを変更して多かれ少なかれ含めるようにし、トークンを生成してチェックするたびに同じ期間に入るようにします。
乱数/データベースソリューションの場合、ランダムトークンの作成日を保存するだけで、希望する期間内にあるかどうかを確認できます。
サードパーティからのOpenID(または同様の)IDを使用している場合は、openIDプロバイダーのページをロードするユーザーにWebViewを表示する必要があります。認証後のリダイレクトページに、生成されたものが含まれていることを確認する必要があります。トークンをどこかに隠し(たとえばタイトル内)、アプリコードで抽出します。
これは自分で実装するのは非常に簡単ですが、トークン認証を処理するためのplay2のプラグイン:
https ://github.com/orefalo/play2-authenticitytoken (個人的に使用されることはありません)とステートレス認証用のプラグイン:
https:// github.com/blendlabs/play20-stateless-auth
logginビットについては、それを実装する必要はありません。プレイに適したモジュールがあります。