5

新しいサーバー間 API を実装する場合、他のユーザーが簡単に使用できるようにするために、どの認証標準を使用できますか?

理想的には、認証がどのように機能するかについて文書化する必要が少ないほど (したがって標準)、サービスを利用する開発者が標準ライブラリを使用できる可能性が高くなります。

ただし、いくつかの制限があります。

  • API が HTTPS で利用できるかどうかは保証できません。複数の Web サイト (1 つの IP アドレスを持つ) をホストしているボックス上にある可能性があるためです。
  • リプレイ攻撃をブロックする必要があります...そのため、リクエストがネットワーク上の別のノードによってキャプチャされた場合、同じリクエストを API に再送信することはできません。
  • 理想的には、リクエストを送信してレスポンスを返すだけでよいので、最初に API に接続してワンタイム キー (ノンス) を取得する必要はありません。
  • 中間者タイプの攻撃を避けるために、リクエストはおそらく送信者によって全体的に署名されている必要があります。

SSL タイプのセットアップは少し複雑すぎるのではないかと思います。ほとんどの開発者は SSL を適切に実装する方法を本当に知らないようです。

oAuth 1.0 では、かなり単純に見えます:

http://provider.example.net/profile
    Authorization: OAuth realm="http://provider.example.net/",
    oauth_consumer_key="dpf43f3p2l4k3l03",
    oauth_signature_method="HMAC-SHA1",
    oauth_signature="IxyYZfG2BaKh8JyEGuHCOin%2F4bA%3D",
    oauth_timestamp="1191242096",
    oauth_token="",
    oauth_nonce="kllo9940pd9333jh",
    oauth_version="1.0"

しかし、開発者は現在 oAuth 2 に注目しているようで、考えられる解決策の 1 つは次のとおりです。

2-legged oauth は OAuth 2.0 でどのように機能しますか?

最初に「/oauth/token」を呼び出してトークンを取得する必要がありますが、これが実際にどのように機能するかについての仕様の形式はあまりないようです (返信を参照)。

http://www.ietf.org/mail-archive/web/oauth/current/msg07957.html

ただし、oAuth 2 で MAC を使用することについての言及がいくつかあります。これは役立つ可能性があります。たとえば、認証を 1 回行って MAC を取得し (ログインの詳細なしで)、この半永久的に保持し、その後のすべてに再利用します。リクエスト:

http://blog.facilelogin.com/2013/01/oauth-20-bearer-token-profile-vs-mac.html

HMAC についての興味深い議論もあります。これは、これがどのように機能するかについての標準がないことを意味します。

http://flascelles.wordpress.com/2010/01/04/standardize-hmac-oauth-restful-authentication-schemes/


その他の注意事項:

oAuth 1.0 の実装、ドキュメント、およびディスカッション:

http://www.ietf.org/mail-archive/web/oauth/current/msg06218.html https://developers.google.com/accounts/docs/OAuth#GoogleAppsOAuth http://oauth.googlecode.com/ svn/spec/ext/consumer_request/1.0/drafts/2/spec.html

残念ながら、oAuth 2.0 について読めば読むほど、Eran Hammerに同意するようになりました。

現在提供されているのは、「コンサルティング サービスと統合ソリューションを販売するためのまったく新しいフロンティア」を提供する、「エンタープライズ向け」の承認プロトコルの青写真です。 http://en.wikipedia.org/wiki/OAuth

4

1 に答える 1

9

クレイグ、素晴らしい質問です。私は専門家ではありませんが、これについて多くのことを考えてきたので、いくつか考えてみます。

最小公倍数に対してコーディングする必要があると仮定し、要件リスト (4 項目すべて) を私の設計シードとして使用すると、次のようになります。

  1. SSL なし- SSL を保証できないため、公開/秘密キーの HMAC 設計を使用する必要があります。すべてのトラフィックが HTTP 経由であり、無限にスニッフィング可能であると仮定してみましょう。つまり、セキュアなトークンや署名キーをネットワーク経由で発信者に転送することはできません。つまり、発信者はすでにそれらを必要としているということです。 AWS が行うこと (または 2-legged OAuth または上記の記事で概説したこと) のようなものです。
  2. No Replay - ナンスを使用してリプレイをブロックする場合、サーバーによって生成される必要はありません。ここでは任意の値を使用できます。nonce は一意である必要があり、HMAC 計算 (署名) に含める必要があり、サーバーはそれを記憶する必要があります。たとえば、クライアントで UUID を nonce として生成し、リクエストに署名してサーバーに送信します。?sig=<a mess of chars>&args=<more stuff>&nonce=f81d4fae-7dec-11d0-a765-00a0c91e6bf6-- サーバーはf81d4fae-7dec-11d0-a765-00a0c91e6bf6処理済みとして記録し、再使用を許可しません。おそらく、妥当な時間 (月は速度/使用状況などによって異なります) が経過した後、DB からこれらを安全に期限切れにすることができます。ヒント: これは、Redis SET とSISMEMBER コマンドを使用するための完璧なユースケースです。
  3. (#2、組み合わせた回答を参照)
  4. 要求は、送信者によって全体が署名されている必要があります。「署名が必要なもの」を理解するための鍵は、HMAC (署名) 計算に含めないものはすべて、中間者 (MITM) によって操作される可能性があるということです。sig に含まれるすべてのものは保護されており、sig チェックが失敗しない限り変更できません。これが、OAuth 仕様 (両方とも) にバイト順の引数、それらを追加する方法、およびそれらを結合する方法に関するペダンティックなルールがある理由ですが、リクエスト全体に署名します。一部の API は、「クエリ文字列全体を取得して署名する」という単純なことを言っていますが、ドメイン名やエンドポイントなど、その署名に含まれたくないものが多すぎて、未来(または多分あなたはそうします、あなたは電話です)。

ご存知のように、安全な API 設計を即座に困難にするのは、すべての通信で HTTPS を必要としない瞬間です。それを行うとすぐに、HMAC/署名リクエストやノンスなどのソリューションに目を向ける必要があります。サーバーとの通信が HTTPS 経由で保護されていて、両者がお互いを信頼できる場合、生活ははるかに良くなり、単純な基本認証などを実行して、サーバーにすべてのリクエストで API_KEY を与えるだけで、誰 (または何が) を作成しているかを識別できます。リクエスト。

それが役立つことを願っています! あなたはすでにこれをかなり調べているようですので、あなたがすでにこれらすべてを知っていて、それが役に立たなかった場合は、私の謝罪.

于 2013-03-24T21:58:51.753 に答える