web-dev-qa-db-ja.com

保護REST PlayフレームワークとOAuth2のAPI

私はPlay 2.およびScalaを使用していくつかのREST APIを公開します。これらのAPIはさまざまなアプリケーション、Web、モバイルまたはデスクトップなので、OAuthプロトコル(OAuth2)が最も適しているようです。

また、最初は外部のOAuth Facebookなどのプロバイダーを使用します。

私の質問は次のとおりです。個々のREST呼び出しを承認するための正確なフローは何ですか?各呼び出しに対してサーバー側で何を期待する必要があり、外部プロバイダーに何を確認する必要がありますか?

OAuth1では、クライアントがすべての署名付きリクエストでトークンを送信したことを知っていましたが、Oauth2ではそうではないと思います。トークンが署名されていない場合は信頼されないため、これはフローではないと思います。

41
Marco

SecureSocialというモジュールを使用できます。

https://github.com/jaliss/securesocial/

これはかなり洗練されており、Playコミュニティの多くの人がこのモジュールを知っている/使用しているようです。

認可のために役立つかもしれません。 https://github.com/schaloner/deadbolt-2/

エンドツーエンドの場合scala stuff、 https://github.com/t2v/play20-auth

17
Rakesh Waghela

Apache AmberをPlay2 Scalaに移植しました。ここにリンクがあります https://github.com/cleanyong/oauth2play2scala

Apache Amberを移植する理由は次のとおりです。

  1. それはテストされました
  2. 自家製より良い
  3. play2 Scala APIに適合します
  4. 使いやすい
  5. 邪魔にならない

サイトにoauth2サーバーをセットアップする場合は、私のポートを使用してみてください。資料あり。

16
Clean Yong

基本的に、標準フローは次のとおりです。

  1. リクエストごとに、Cookie(Play!ダイアレクトの「セッション」)にIDが含まれているかどうかを確認します。
  2. そうでない場合は、プロバイダーに認証するようにユーザーに要求します(Facebookまたは他の何か)
  3. 正常な場合、プロバイダーはIDを返し、このIDを永続化システム(登録)、および現在のCookie /セッションに保存します
  4. 次のリクエストで、IDがCookie /セッションに存在し、永続化システムの既存のユーザーに対応するかどうかを確認します
  5. 「ログアウト」するには、Cookie /セッションをクリアするだけです

詳細が必要な場合は、お問い合わせください:-)

7
ndeverge

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をサポートするには、キー管理システムが必要です。

  1. アプリのキー/シークレットを生成します。
  2. AccessToken/Refresh_token/authorization_codeの生成

エンドポイントに到達すると、公開する必要があります。

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エコシステムを使用できます。

4
Abhishek Tyagi

私は自分で試したわけではありませんが、 tuxdna モジュールについてはどうでしょう。 github repoのようにそれは言う:

Playを使用したOAuth2サーバー! 2.0フレームワーク

これが役に立てば幸い

1
mosid

OAuth 2プロバイダーとDeadboltを組み合わせたこのテンプレートをプレイに使用してみてください。OAuthスコープはDeadbolt権限と役割の概念にマップされます。Redisを使用してアクセストークンを保存すると、構成した期間が過ぎると自動的に期限切れになります。

https://github.com/lglossman/scala-oauth2-deadbolt-redis

0

私が行ったのと同じ問題がありました(私はそれが最良の解決策ではないと思います)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");
    }
...
}

お役に立てれば

0
user9869932