私はPlay 2.およびScalaを使用していくつかのREST APIを公開します。これらのAPIはさまざまなアプリケーション、Web、モバイルまたはデスクトップなので、OAuthプロトコル(OAuth2)が最も適しているようです。
また、最初は外部のOAuth Facebookなどのプロバイダーを使用します。
私の質問は次のとおりです。個々のREST呼び出しを承認するための正確なフローは何ですか?各呼び出しに対してサーバー側で何を期待する必要があり、外部プロバイダーに何を確認する必要がありますか?
OAuth1では、クライアントがすべての署名付きリクエストでトークンを送信したことを知っていましたが、Oauth2ではそうではないと思います。トークンが署名されていない場合は信頼されないため、これはフローではないと思います。
SecureSocialというモジュールを使用できます。
https://github.com/jaliss/securesocial/
これはかなり洗練されており、Playコミュニティの多くの人がこのモジュールを知っている/使用しているようです。
認可のために役立つかもしれません。 https://github.com/schaloner/deadbolt-2/
エンドツーエンドの場合scala stuff、 https://github.com/t2v/play20-auth
Apache AmberをPlay2 Scalaに移植しました。ここにリンクがあります https://github.com/cleanyong/oauth2play2scala
Apache Amberを移植する理由は次のとおりです。
サイトにoauth2サーバーをセットアップする場合は、私のポートを使用してみてください。資料あり。
基本的に、標準フローは次のとおりです。
詳細が必要な場合は、お問い合わせください:-)
OAuthは承認プロトコルであるため、認証ソリューションを検討している場合、これは適切ではない可能性があります。
あなたは、APIのコンシューマーがさまざまなアプリケーションになると言っています。これは2つのシナリオにつながり、
1. Where there is no end user involved (grant_type: client_credential)
2. Where end-user can consume these APIs on multiple Application (Owned by your Org) (grant_type: implicit/password)
3. Where end-user can consume these APIs via third Party Applications.(authrization_code)
OAuth Eco-Systemをサポートするには、キー管理システムが必要です。
エンドポイントに到達すると、公開する必要があります。
3-Legged OAuth
GET /authorize authorize{entry point/ initiate oauth}
Sample Call: http://YourAPIService.com/authorize?response_type=code&client_id=GG1IbStzH45ajx9cEeILqjFt&scope=READ&redirect_uri=www.google.com
GET /login login (Call Page for login App, 302 redirected from /authorize)
Sample Call: http://YourAPIService.com/v1/oauth20/login?response_type=code&client_id=GG1IbStzH45ajx9cEeILqjFt&scope=READ&redirect_uri=www.google.com
POST /dologin consentPage http://YourAPIService.com/dologin
Submit the credential, On success, render the application page
POST /grantpermission consentSubmission http://YourAPIService.com/grantpermission
Permission has been granted/declined. Send a 302 to generate authorization_code
GET /code AuthorizationCode {To generate auth code}
Sample Call: http://YourAPIService.com/code?client_id=GG1IbStzH45ajx9cEeILqjFt&response_type=code&[email protected]&redirect_uri=www.google.com
POST /token GenerateAccessToken http://YourAPIService.com/token
Sample call: http://kohls-test.mars.apigee.net/v1/oauth20/token
Header: Authorization: Basic R0cxSWJTdHpINDVhang5Y0VlSUxxalFj its generated with apps Api Key & Secret.
Payload:
grant_type=authorization_code&scope=x&redirect_uri=www.google.com&code=abc123
それ以外の場合、最も単純で堅牢なソリューションは http://apigee.com です。
Apigeeの既存のOAuthエコシステムを使用できます。
私は自分で試したわけではありませんが、 tuxdna モジュールについてはどうでしょう。 github repoのようにそれは言う:
Playを使用したOAuth2サーバー! 2.0フレームワーク
これが役に立てば幸い
OAuth 2プロバイダーとDeadboltを組み合わせたこのテンプレートをプレイに使用してみてください。OAuthスコープはDeadbolt権限と役割の概念にマップされます。Redisを使用してアクセストークンを保存すると、構成した期間が過ぎると自動的に期限切れになります。
私が行ったのと同じ問題がありました(私はそれが最良の解決策ではないと思います)RESTサーバーのメソッドを "@ Security.Authenticated(Secure.class) "、およびセッションCookieを使用します(これもバックエンドのハッシュテーブル内に登録されています。セッションCookieはユーザーのサインイン後に生成されました
I post code:
package controllers;
import ...;
@Security.Authenticated(Secured.class)
public class ExampleController extends Controller {
public static String currentUserEmail() {
... return json after checking that 'session("id")' exists in the loggedin users hash table...
}
そして
package controllers;
import ...;
public class Secure extends Security.Authenticator {
@Override
public String getUserId(Http.Context context) {
return context.session().get("user_id");
}
...
}
お役に立てれば