web-dev-qa-db-ja.com

REST AP​​Iログインパターン

動詞ではなく名詞を使用したapiバージョン、コレクションごとに2つのapiパス、GET REST PUT DELETEなどを使用して、apigeeの提案に従って、POST apiを作成します。

私はログインシステムに取り組んでいますが、ログインユーザーへの正しいREST方法がわからない。現時点ではセキュリティについては取り組んでいません。ログインパターンまたはフローについてだけです。 (後で、HMACなどで2段階のoAuthを追加する予定です)

可能なオプション

  • POSTからhttps://api...com/v1/login.jsonのようなもの
  • https://api...com/v1/users.jsonのようなものへのPUT
  • 私がしていない何か...

ユーザーのログインに適したRESTスタイルは何ですか?

171
Scott Roepnack

Roy T. FieldingおよびRichard N. Taylorによる最新のWebアーキテクチャーの原理設計 、つまりすべてのRESTの用語からの一連の作業には、クライアントとサーバーの対話の定義が含まれています。

すべてのREST相互作用はステートレスです。つまり、各要求には、先行する可能性のある要求とは無関係に、コネクターが要求を理解するために必要なすべての情報が含まれています

この制限は4つの機能を実現します。1番目と3番目はこの特定の場合に重要です。

  • 1st:itは、リクエスト間でアプリケーション状態を保持するためのコネクタの必要性を排除し、物理リソースの消費を減らし、スケーラビリティを向上させます。 ;
  • rd:仲介者はリクエストを個別に表示し理解することができます。これはサービスが動的に再配置されるときに必要になるかもしれません。

そして今、あなたのセキュリティケースに戻りましょう。すべての要求にすべての必要な情報が含まれている必要があり、承認/認証も例外ではありません。これを達成する方法?文字通り、すべての要求とと​​もに、必要な情報をすべてワイヤで送信します。

これを裏付ける方法の1つの例は、 ハッシュベースのメッセージ認証コードまたはHMAC 実際には、これはすべてのリクエストに現在のメッセージのハッシュコードを追加することを意味します。 暗号化ハッシュ関数秘密暗号鍵を組み合わせて計算されたハッシュコード。 暗号化ハッシュ関数は事前定義されているか、code-on-demand REST概念の一部です(たとえばJavaScript)。 Secret cryptographic keyはリソースとしてサーバからクライアントに提供されるべきで、クライアントはそれを使用してすべてのリクエストのハッシュコードを計算します。

HMACの実装例はたくさんありますが、次の3つに注意してください。

実際にどのように機能するのか

クライアントが秘密鍵を知っていれば、リソースを使って操作する準備ができています。そうでなければ、彼は一時的に認証され秘密鍵を取得するためにリダイレクトされ(ステータスコード307 Temporary Redirect)、その後元のリソースにリダイレクトされます。この場合、クライアントを認証するためのURLが何であるかを事前に知る必要がない(つまりどこかにハードコード)、そしてこのスキーマを時間の経過とともに調整することが可能です。

これが適切な解決策を見つけるのに役立つことを願っています!

128
Akim

TL; DR各リクエストのログインは、APIセキュリティを実装するために必要なコンポーネントではありません、認証です。

セキュリティ全般について話さずにログインに関するあなたの質問に答えるのは難しいです。認証方式によっては、従来のログイン方法はありません。

RESTはセキュリティルールを規定していませんが、実際に最も一般的な実装は、(あなたがあなたの質問で述べたように)3-way認証を使ったOAuthです。少なくとも各APIリクエストでは、それ自体はログインしません。 3方向認証では、トークンを使用するだけです。

  1. ユーザーがAPIクライアントを承認し、有効期間の長いトークンの形式で要求を行う許可を付与します
  2. APIクライアントは、長寿命のトークンを使用して短寿命のトークンを取得します。
  3. Apiクライアントは、リクエストごとに寿命の短いトークンを送信します。

この方式により、ユーザーはいつでもアクセスを取り消すことができます。私がこれまでに公開してきた事実上すべてのRESTful APIはOAuthを使ってこれを実装しています。

私はあなたがログインの観点からあなたの問題(そして質問)を組み立てるべきではないと思うだけではなく、むしろ一般にAPIを安全にすることを考えます。

一般的なREST AP​​Iの認証の詳細については、次の資料を参照してください。

41
Slavo

REST哲学の大部分は、APIを設計するときにHTTPプロトコルの標準機能をできるだけ多く活用することです。その理念を認証に適用すると、クライアントとサーバーはAPIの標準HTTP認証機能を利用します。

ログイン画面は、ユーザーのユースケースに最適です。ログイン画面にアクセスし、ユーザー/パスワードを入力し、Cookieを設定し、クライアントは将来のすべての要求でそのCookieを提供します。 Webブラウザを使用している人は、個々のHTTPリクエストごとにユーザーIDとパスワードを提供することは期待できません。

しかし、REST AP​​Iでは、各要求に人間のユーザに影響を与えずに認証情報を含めることができるため、ログイン画面とセッションCookieは必ずしも必要ではありません。また、クライアントがいつでも協力しない場合は、401 "unauthorized"応答が返される可能性があります。 RFC 2617 はHTTPにおける認証サポートを説明しています。

TLS(HTTPS)もまた選択肢であり、他の当事者の公開鍵を検証することによってすべての要求においてクライアントからサーバへの認証(およびその逆)を可能にするであろう。さらに、これはチャンネルにボーナスを確保します。もちろん、これを行うには通信前の鍵ペア交換が必要です。 (注:これは特にTLSを使用してユーザーを識別/認証するためのものです。TLS/ Diffie-Hellmanを使用してチャネルを保護することは、ユーザーをその公開鍵で識別しなくても常にお勧めです。)

例:OAuthトークンがあなたの完全なログイン認証情報であるとしましょう。クライアントがOAuthトークンを取得したら、それを各HTTPリクエストの標準HTTP認証でユーザーIDとして提供できます。サーバーは最初の使用時にトークンを検証し、各要求ごとに更新される有効期間でチェックの結果をキャッシュに入れることができます。認証が必要な要求は、指定されていなければ401を返します。

24
wberry