現在認証がないRESTfulAPIを使用してPylonsベースのWebアプリケーションを構築しています。そこで、それを実装し、ユーザーパスワードの保存に関するすべてのトラブルと注意を回避するために、認証にOpenIDを使用したいと思います。これを行うための最良の方法は何でしょうか?これら2つは互換性がありますか?インスピレーションを得ることができるOpenIDを使用する既存のRESTAPIはありますか?
3 に答える
私は今、オプションの調査に時間を費やしており、調査結果を要約したいと思います。まず、もう少しコンテキストを増やします。サービスとAPIコンシューマーの両方を開発および制御します。コンシューマーはFlashベースのアプリであり、APIが現在使用されているのと同じホストから提供され、ブラウザーで使用されることになっています。サードパーティのクライアントはまだ見えていません。
したがって、質問は2つの部分に分けることができます。
- APIを介してOpenID認証を行うにはどうすればよいですか
- 後続のリクエストで「認証済み」状態を維持するにはどうすればよいですか
最初の部分では、OpenID認証にはほとんどの場合インタラクティブな手順が含まれます。認証プロセス中に、ユーザーがOpenIDプロバイダーのWebページにアクセスし、サインインして[同意する]ボタンを押すステップが発生する可能性があります。したがって、APIはこれを透過的に処理することはできず、またそうすべきではありません(「OpenIDプロバイダーとパスワードを教えてください。残りは私が行います」)。それができる最善のことは、クライアントが開いて指示に従う必要があるHTTPリンクを渡したり戻したりすることです。
「認証済み」状態の維持
REST APIはステートレスである必要があり、各リクエストには、それを処理するために必要なすべての情報が含まれている必要があります。リクエストごとにOpenIDプロバイダーに対して認証することは意味がないため、何らかのセッションが必要です。セッションキー(または「アクセストークン」またはユーザー名/パスワード)を通信するためのオプションのいくつかは次のとおりです。
- HTTPS + BASIC認証(各リクエストの「承認:基本...」ヘッダー)
- リクエストに署名するAmazonスタイル(各リクエストの「承認:AWS ...」ヘッダー)
- OAuth:アクセストークンを取得し、それと他の多くのパラメーターを各リクエストに含めます
- セッションキーを保存するCookie(各リクエストの「Cookie:...」ヘッダー)
- Cookie自体にセッション情報を保存する署名付きCookie
現在、APIコンシューマーは1つしかないため、機能する可能性のある最も単純なもの、つまりCookieを選択しました。それらはビーカーの助けを借りて、パイロンで非常に簡単に使用できます。また、Flashアプリでも「正常に機能」します。ブラウザー内で実行されるため、ブラウザーはFlashアプリが行うリクエストに関連するCookieを含めます。これに関して、アプリを変更する必要はまったくありません。これは、Cookieの使用を提唱するStackOverflowの質問の1つです。WebアプリケーションのRESTful認証
Beakerには、すべてのセッションデータがCookie自体に含まれているCookieのみのセッションの優れた機能もあります。私はこれがそれが得るのと同じくらいステートレスだと思います。サーバーにセッションストアはありません。Cookieは署名され、オプションで暗号化されて、クライアント側での改ざんを防ぎます。欠点は、Cookieがセッションキー以上のものを格納する必要があるため、Cookieが少し大きくなることです。セッションで本当に必要のないもの(OpenID認証の残り物)を削除することで、Cookieのサイズを約200バイトに減らしました。
OAuthは、APIの使用に適しています。Pythonで使用されているOAuthの例を次に示します:oauth-python-twitter。Leah Culverのpython-oauthライブラリは、PythonでのOAuthの標準的な実装ですが、python-oauth2は、最近話題になっている候補です。インスピレーションに関しては、django-pistonは、Django用のRESTful APIを作成するときに、OAuthを使用して認証を行うことをサポートしていますが、ドキュメントは、その特定のトピックについて私が望むほど良くはありません。
APIを構築する場合は、OAuthプロトコルを確認できます。OpenIDを補完します。