1. ホーム
  2. web-services

[解決済み] RESTful Web サービス - 他のサービスからのリクエストを認証する方法とは?

2022-09-30 07:36:34

質問

私は、ユーザーだけでなく、他のWebサービスやアプリケーションからもアクセスされる必要があるRESTfulなWebサービスを設計しています。すべての受信リクエストは認証される必要があります。すべての通信はHTTPSで行われます。ユーザー認証は認証トークンによって行われ、ユーザー名とパスワードを(SSL 接続で)POST して /session リソースに POST することで取得できます。

ウェブサービスクライアントの場合は エンドユーザーがいない クライアントサービスの背後には リクエストはスケジュールされたタスク、イベント、または他のコンピュータ操作によって開始されます。接続するサービスのリストは事前に知られています (当然ですね)。 他の(Web)サービスから来るこれらのリクエストをどのように認証すればいいのでしょうか? これらのサービスに対して、できるだけ簡単に認証プロセスを実装したいのですが、セキュリティが犠牲になることはありません。このようなシナリオのための標準およびベストプラクティスは何でしょうか?

私が思いつく(または私に提案された)オプション。

  1. クライアント サービスに "偽のユーザー名とパスワードを持たせ、ユーザーと同じ方法で認証させる。このオプションは好きではありません - 正しくないと感じます。

  2. クライアント サービスの恒久的なアプリケーション ID、おそらくアプリケーション キーも割り当てます。私が理解した限りでは、これはユーザー名とパスワードを持つのと同じです。この ID とキーで、各リクエストを認証するか、認証トークンを作成して、さらにリクエストを認証することができます。いずれにせよ、アプリケーションIDとキーを手に入れることができれば、誰でもクライアントになりすますことができるので、このオプションは好きではありません。

  3. 私は以前のオプションにIPアドレスのチェックを追加することができました。これにより、偽のリクエストを実行することが難しくなるでしょう。

  4. クライアント証明書。私自身の認証局をセットアップし、ルート証明書を作成し、クライアント サービス用のクライアント証明書を作成します。a) 証明書なしでユーザーが認証できるようにするにはどうすればよいか、b) クライアント サービスの観点からこのシナリオを実装するのはどれほど複雑か、という問題です。

  5. 他の何か - 他のソリューションがあるに違いない?

私のサービスはJava上で動作しますが、私は基本原理により興味があり、実装の詳細にはあまり興味がないので、どの特定のフレームワーク上で構築されるかの情報を意図的に省きました。しかし、私はこのテーマについて少し経験が浅いので、実際の実装に関する具体的なヒントや例(有用なサードパーティのライブラリ、記事など)も大いに評価されることでしょう。

どのように解決するのですか?

この問題に対する解決策は、共有の秘密に帰着します。私は、ユーザー名とパスワードをハードコードするオプションも好きではありませんが、非常にシンプルであるという利点があります。クライアント証明書も良いのですが、本当に大差はないのでしょうか。サーバーに1つ、クライアントに1つの証明書があります。主な利点は、ブルートフォース(総当たり)が難しいということです。しかし、それに対して他の保護が施されていることを望みます。

クライアント証明書ソリューションのポイントAは、解決するのが難しいとは思いません。ブランチを使用するだけです。 if (client side certificat) { check it } else { http basic auth } 私はJavaの専門家ではありませんし、クライアントサイドの証明書を作成するためにJavaを使用したことは一度もありません。しかし、ググってみると このチュートリアル があり、これはあなたの好みに合うようです。

このような「何がベストか」という議論にもかかわらず、「より少ないコード、より少ない賢さが良い」という別の哲学があることを指摘させてください (私は個人的にこの哲学を持っています)。クライアント証明書の解決策は、多くのコードを含んでいるように聞こえます。

OAuthに疑問をお持ちのようですが、OAuth2の提案には、"という解決策が含まれています。 ベアラートークン という解決策があります。私は、単純化のために、ハードコードされたユーザー/パス(アプリごとに 1 つで、個別に取り消すことができます)または非常に類似したベアラ トークンのどちらかを選択すると思います。