2015-10-13 14 views
9

私はAPIを持っています。それらの一部は、OAuthによる第三者アプリケーションからのアクセスに限定されています。Webアプリケーションから自分のAPIに安全にアクセスするにはどうすればいいですか?

私もWebアプリケーションを持っています。ユーザーはログインして個人情報を見ることができます。

APIはWebアプリケーションからも呼び出されます。私の質問は、セキュリティ対策を講じてAPIにアクセスする良い方法である。

1. Third party applications -> OAuth 

2. My own web application -> ??? 

私のWebアプリケーションは認証にセッションIDを使用します。私は、HTTPヘッダーでセッションIDを転送するのは良い方法かもしれないと思いますが、私は自信がありません。 APIが代わりにOAuthの認証のためのセッションを使用してユーザーを識別し、この要求を受信した場合exmapleについては

...

$ curl -X PUT \ 
     -H "X-Sample-Application-Id: "My own web application's ID" \ 
     -H "X-Sample-Session-Token: yeoql2dvn7whpm4tbe61viscv" \ 

....

すべてのヘルプは理解されるであろう。

おかげで、

..私は同様の質問

Questions About Consuming Your Own API with OAuth


アップデート1

は、いくつかは、JWT(JSONウェブトークン)が良いと言いました。

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

http://blog.mitsuruog.info/2014/08/jwtjson-web-tokenwebapicredential.html


アップデート2

私はOAuthのの "リソース所有者のパスワードの資格"

https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/709.html

それとも...「Clientを使用することができるかもしれクレイド「ntials grant」はもっとよく見えます。

答えて

9

私はこれについて少し詳しく説明します。それは良い質問であり、その周りには多くの混乱があります。

保護しようとしているAPIが、サードパーティの開発者ではなくサーバー側のアプリケーション専用に使用されている場合は、HTTP基本認証を使用してAPIサービスをセキュリティで保護することを強くお勧めします。ユーザー(複数可)については

  • 、IDとシークレットで構成されてAPIキーのペア(複数可)を生成します。

    これが機能する方法は超簡単です。 APIキーはユーザー名/パスワードと同義です。 UUIDライブラリを使用してランダムID /シークレット値を生成するだけです。

  • APIサービスに対して認証するときは、HTTP認証ヘッダーにAPI資格情報を入力して、自分自身を識別します。ここでは、それはcurlを使用してどのように見えるかです:

    $カール--user私-API-鍵ID:

    何基本認証についての素晴らしいのは、つまり

  • これは実装が非常に簡単です。
  • これはよく定義された標準です。
  • HTTPS経由でリクエストを行い、APIキーを公開しない限り、安全です。

今、サーバー側のアプリケーションだけでなく、さまざまな環境のユーザーを認証するAPIサービスを構築する場合、実際にはOAuth2プロトコルを使用する必要があります。

これはそのために設計されたものです。

のOAuth2プロトコルは、さまざまな方法でユーザーを認証することができます - しかし、結果として、非常に複雑です。あなたがなど/人気のライブラリを使用している場合でも、あなたのサイトにはOAuthを追加すると、挑戦することができ

ここでのOAuthは(クイック内訳)どのように動作するかです:

パスワードグラント

パスワードをOAuthのフローは、アクセストークン(通常はJWT)のユーザ名/パスワードを交換する場所です。次に、HTTP Authorizationヘッダーのアクセストークンを使用して、APIサービスで自分自身を識別します。

これが反応/角度だけでなく、モバイルアプリケーションでのSPAを構築するとき、ほとんどの人が何をすべきかです。

クライアントの資格情報を使用すると、アクセストークンのために(ちょうど基本認証のような)APIキーを交換する場所クライアントの資格情報の流れがある

を付与します。次に、HTTP Authorizationヘッダーのアクセストークンを使用して、APIサービスで自分自身を識別します。

これは、OAuthを使用してサーバー側アプリケーションを構築するとき、人々は何をすべきかです。

暗黙の助成

このフローでは、Facebookのようないくつかの場所にログインする際にあなたが見るものです。あなたはボタンをクリックし、他のサイトにリダイレクトされて許可を受け入れ/受け入れます。そして最後にあなた自身を識別するために使うトークンを使ってメインサイトに戻ります。これはAPIサービスにとって理想的ではありません。

認証コードグラント

あなたが戻ってあなた自身を識別するために使用するアクセストークンのためにあなたがしてEXCHANGE認証コードを取得する以外この流れは、まさに暗黙の流れのようなものです。これはAPIサービスにとって理想的ではありません。もう少し安全です。

ユースケースのためにOAuthを使用する予定がある場合は、Stormpathのような認証プロバイダをチェックアウトすることを強くおすすめします。彼らはこのようなことを多く自動化し、OAuthを中心に多くの複雑さを解決します。

それ以外の場合は、基本認証を行ってください!

+1

私は遅刻して申し訳ありません。あなたの提案は素晴らしく、私はそんな素晴らしいアイデアを考えたことはありません。最終的に私は独自のモバイルアプリも実装する必要があるため、パスワードの付与タイプを選択しました。 (私たちは第三者のモバイルアプリ開発者向けにAPIを提供する予定です)また、OAuthさえ複雑ですが、いくつかのライブラリを見つけることができます。これは私にとっても良いことです。基本的な認証を使用してカスタム実装が必要かもしれませんが、生成されたキーと秘密を保存するためのテーブルを作成するようにはわかりません。 – zono

+0

説明のおかげで、私はパスワードの付与についていくつかの質問があります。私は、要求を受け入れるためにclient_idとclient_secretを必要とする基本認証でoauth/tokenを保護する認証サーバーを構築しました。しかし、どのように私はclient_secretを保護することができますか?クライアントはAngular 2アプリです。基本認証でoauth/token URIを保護する必要がありますか? – Paolo

関連する問題