2009-12-02 11 views
30

私はRESTfulなAPIを備えたPylonsベースのWebアプリケーションを構築していますが、現在のところ、認証が不足しています。だから私はそれを実装するつもりで、すべてのトラブルやユーザのパスワードの保存に関する注意を避けるために、認証にOpenIDを使いたいと思います。これを行う最善の方法は何でしょうか?これらの2つは互換性がありますか? OpenIDを使用する既存のREST APIがインスピレーションを受けていますか?RESTful APIでOpenIDを使用するには?

答えて

30

私は今、オプションの研究に時間を費やしており、結果を要約したいと思います。 まずは、サービスとAPIコンシューマーの両方を開発し、制御します。コンシューマーは、現在のAPIと同じホストから提供され、ブラウザーで使用されるはずのFlashベースのアプリです。まだサードパーティのクライアントは見えません。そこで問題は2つの部分に分けることができます

、私はAPI経由でOpenID認証を行うのですか

  • 私はその後の要求に「認証済み」状態を維持しない方法

最初の部分では、OpenID認証にはほとんど常に対話的な手順が含まれています。認証プロセス中には、ユーザーがOpenIDプロバイダのWebページにアクセスし、サインインして「同意する」ボタンを押すステップがあります。したがって、APIはこれを透過的に処理することはできません。また、処理してはいけません(「OpenIDプロバイダとパスワードを教えてください」とは言いません)。クライアントが指示を出して指示に従わなければならないHTTPリンクを前後に渡すのが最善の方法です。

REST APIはステートレスである必要があり、「認証済み」状態の維持、各要求は、右、それを処理するために必要なすべての情報を含める必要がありますか?リクエストごとにOpenIDプロバイダに対して認証するのは意味がありません。だから、いくつかのセッションは、セッションが必要です。セッションキー(または「アクセストークン」またはユーザ名/パスワード)を通信するためのオプションの一部は以下のとおりです。

  • HTTPS + BASIC認証(「認可:基本的な...」各リクエストのヘッダ)
  • 署名要求Amazon-style(「認可:AWS ...」は、各リクエストのヘッダ)
  • のOAuth:アクセストークンを取得するには、そのセッション鍵(「クッキーを格納する各要求
  • クッキーに他のパラメータの束を含みます... "各要求のヘッダー)
  • セッション情報を格納する署名付きのCookieクッキー自体の中にある

ただ今はAPIのコンシューマーが1つしかないので、私はクッキーが動作する可能性のある最も単純なものを選択しました。彼らはBeakerの助けを借りて、パイロンで使うのはとても簡単です。彼らはまた、Flashアプリケーションで "ただの仕事" - それはブラウザ内で実行されるので、ブラウザはFlashアプリケーションが作る要求に関連するCookieを含みます - アプリケーションはそれに関して全く変更する必要はありません。 RESTful authentication for web applications

ビーカーには、すべてのセッションデータがクッキー自体に含まれているcookie-only sessionsという素晴らしい機能があります。私はこれが得られるほど無国籍であると思います。サーバー上にセッションストアがありません。クッキーは署名され、オプションで暗号化され、クライアント側での改ざんを防ぎます。欠点は、セッションキー以上のデータを保存する必要があるため、Cookieが少し大きくなることです。私がセッションで本当に必要としなかったもの(OpenID認証の残り物)を削除することで、約200バイトまでのクッキーサイズが得られました。

4

OAuthは、APIの使用に適しています。 Pythonで使用されているOAuthの例を次に示します:oauth-python-twitter Leah Culverのpython-oauthライブラリは、PythonでのOAuthの正式な実装ですが、python-oauth2は最近流行している話題です。インスピレーションに関しては、django-pistonは、Django用のRESTful APIを作成するときにOAuthを使用して認証を行うことをサポートしていますが、その特定のトピックについてはドキュメントがうまくいきません。

+0

APIは、現在、クライアント - サーバーのシナリオを対象としています。クライアントはFlashアプリ、サーバーはPylons webappです。現在のところ、サーバー間のものはありませんので、3足のものはまだ必要ありません。私の現在の問題は、パスワードの保存、パスワードリマインダの送信、パスワードのリセットなどを扱うことなく、システムに「認証されたユーザ」を導入する方法です。 OAuthがここで私をどのように助けているかはすぐには分かりません。なぜなら2-leggedバージョンではリクエストに署名する方法しか指定していないからです。 –

+1

その場合、http://pylonshq.com/pasties/by_tag/openidにあるペーストの1つが役に立ちます。 –

3

APIを作成する場合は、OAuthプロトコルをチェックできます。 OpenIDを補完するものです。

関連する問題