ユーザーだけでなく、他の Web サービスやアプリケーションもアクセスする必要がある RESTful Web サービスを設計しています。着信要求はすべて認証する必要があります。すべての通信は HTTPS 経由で行われます。ユーザー認証は、サービスによって提供される/sessionリソースに (SSL 接続を介して) ユーザー名とパスワードを POST することによって取得される認証トークンに基づいて機能します。
Web サービス クライアントの場合、クライアント サービスの背後にエンド ユーザーは存在しません。要求は、スケジュールされたタスク、イベント、またはその他のコンピューター操作によって開始されます。接続するサービスのリストは事前にわかっています (当然だと思います)。他の (Web) サービスからのこれらのリクエストをどのように認証すればよいですか? これらのサービスの認証プロセスをできるだけ簡単に実装したいと考えていますが、セキュリティを犠牲にすることはありません。このようなシナリオの標準およびベスト プラクティスは何でしょうか?
私が考えることができる(または私に提案された)オプション:
クライアント サービスに「偽の」ユーザー名とパスワードを使用させ、ユーザーと同じ方法で認証させます。私はこのオプションが好きではありません - それはちょうど正しく感じられません.
クライアント サービスに永続的なアプリケーション ID を割り当てます。場合によっては、アプリケーション キーも割り当てます。私が理解している限り、これはユーザー名 + パスワードを持つこととまったく同じです。この ID とキーを使用して、各リクエストを認証するか、認証トークンを作成して以降のリクエストを認証することができます。いずれにせよ、アプリケーション ID とキーを入手できる人は誰でもクライアントになりすますことができるため、このオプションは好きではありません。
前のオプションに IP アドレス チェックを追加できます。これにより、偽のリクエストを実行することが難しくなります。
クライアント証明書。独自の認証局を設定し、ルート証明書を作成し、クライアント サービス用のクライアント証明書を作成します。ただし、いくつかの問題が思い浮かびます: a) 証明書なしでユーザーを認証できるようにするにはどうすればよいですか? b) クライアント サービスの観点から、このシナリオを実装するのはどれほど複雑ですか?
他に何か - 他の解決策があるはずですか?
私のサービスはJavaで実行されますが、実装の詳細ではなく基本原則に関心があるため、それが構築される特定のフレームワークに関する情報を意図的に省略しました-これに対する最善の解決策は基盤となるフレームワークに関係なく実装できます。ただし、私はこのテーマに少し慣れていないので、実際の実装に関する具体的なヒントや例 (便利なサードパーティ ライブラリ、記事など) も同様に高く評価されます。