[解決済み] RESTful Web サービス - 他のサービスからのリクエストを認証する方法とは?
質問
私は、ユーザーだけでなく、他のWebサービスやアプリケーションからもアクセスされる必要があるRESTfulなWebサービスを設計しています。すべての受信リクエストは認証される必要があります。すべての通信はHTTPSで行われます。ユーザー認証は認証トークンによって行われ、ユーザー名とパスワードを(SSL 接続で)POST して /session リソースに POST することで取得できます。
ウェブサービスクライアントの場合は エンドユーザーがいない クライアントサービスの背後には リクエストはスケジュールされたタスク、イベント、または他のコンピュータ操作によって開始されます。接続するサービスのリストは事前に知られています (当然ですね)。 他の(Web)サービスから来るこれらのリクエストをどのように認証すればいいのでしょうか? これらのサービスに対して、できるだけ簡単に認証プロセスを実装したいのですが、セキュリティが犠牲になることはありません。このようなシナリオのための標準およびベストプラクティスは何でしょうか?
私が思いつく(または私に提案された)オプション。
-
クライアント サービスに "偽のユーザー名とパスワードを持たせ、ユーザーと同じ方法で認証させる。このオプションは好きではありません - 正しくないと感じます。
-
クライアント サービスの恒久的なアプリケーション ID、おそらくアプリケーション キーも割り当てます。私が理解した限りでは、これはユーザー名とパスワードを持つのと同じです。この ID とキーで、各リクエストを認証するか、認証トークンを作成して、さらにリクエストを認証することができます。いずれにせよ、アプリケーションIDとキーを手に入れることができれば、誰でもクライアントになりすますことができるので、このオプションは好きではありません。
-
私は以前のオプションにIPアドレスのチェックを追加することができました。これにより、偽のリクエストを実行することが難しくなるでしょう。
-
クライアント証明書。私自身の認証局をセットアップし、ルート証明書を作成し、クライアント サービス用のクライアント証明書を作成します。a) 証明書なしでユーザーが認証できるようにするにはどうすればよいか、b) クライアント サービスの観点からこのシナリオを実装するのはどれほど複雑か、という問題です。
-
他の何か - 他のソリューションがあるに違いない?
私のサービスはJava上で動作しますが、私は基本原理により興味があり、実装の詳細にはあまり興味がないので、どの特定のフレームワーク上で構築されるかの情報を意図的に省きました。しかし、私はこのテーマについて少し経験が浅いので、実際の実装に関する具体的なヒントや例(有用なサードパーティのライブラリ、記事など)も大いに評価されることでしょう。
どのように解決するのですか?
この問題に対する解決策は、共有の秘密に帰着します。私は、ユーザー名とパスワードをハードコードするオプションも好きではありませんが、非常にシンプルであるという利点があります。クライアント証明書も良いのですが、本当に大差はないのでしょうか。サーバーに1つ、クライアントに1つの証明書があります。主な利点は、ブルートフォース(総当たり)が難しいということです。しかし、それに対して他の保護が施されていることを望みます。
クライアント証明書ソリューションのポイントAは、解決するのが難しいとは思いません。ブランチを使用するだけです。
if (client side certificat) { check it } else { http basic auth }
私はJavaの専門家ではありませんし、クライアントサイドの証明書を作成するためにJavaを使用したことは一度もありません。しかし、ググってみると
このチュートリアル
があり、これはあなたの好みに合うようです。
このような「何がベストか」という議論にもかかわらず、「より少ないコード、より少ない賢さが良い」という別の哲学があることを指摘させてください (私は個人的にこの哲学を持っています)。クライアント証明書の解決策は、多くのコードを含んでいるように聞こえます。
OAuthに疑問をお持ちのようですが、OAuth2の提案には、"という解決策が含まれています。 ベアラートークン という解決策があります。私は、単純化のために、ハードコードされたユーザー/パス(アプリごとに 1 つで、個別に取り消すことができます)または非常に類似したベアラ トークンのどちらかを選択すると思います。
関連
-
[解決済み] Outlook.comでは、Webhook/push通知のサポートはありますか?
-
[解決済み] JSONの文字エンコーディング - UTF-8はブラウザでよくサポートされていますか、それとも数字のエスケープシーケンスを使用すべきですか?
-
[解決済み] RESTを理解する。動詞、エラーコード、認証
-
[解決済み] JWT(JSONウェブトークン)の有効期限を自動的に延長する機能
-
[解決済み] JAX-RSとJerseyでRESTトークンベースの認証を実装する方法
-
[解決済み] 認証とセッション管理に関するSPAのベストプラクティス
-
[解決済み】RESTウェブサービスを使用して、メタデータを含むファイルをアップロードするにはどうすればよいですか?
-
[解決済み】メッセージキューとウェブサービスは?[をご紹介します。]
-
[解決済み】ODataとRESTのWebサービスの違いについて
-
[解決済み】セッションは本当にRESTfulnessに違反するのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Spring RestTemplateクライアント - 接続拒否例外
-
[解決済み] JSONの文字エンコーディング - UTF-8はブラウザでよくサポートされていますか、それとも数字のエスケープシーケンスを使用すべきですか?
-
[解決済み】RESTウェブサービスを使用して、メタデータを含むファイルをアップロードするにはどうすればよいですか?
-
[解決済み】メッセージキューとウェブサービスは?[をご紹介します。]
-
[解決済み】XSDとWSDLの違いは何ですか?
-
[解決済み】REST API 404。不正な URI、またはリソースの欠落?
-
[解決済み] わかりやすく言うと「Webサービス」って何?
-
[解決済み] セキュアなWebサービス:REST over HTTPS vs SOAP + WS-Security。どちらが優れているか?[クローズド]。
-
[解決済み] Delphi XE用SOAPサーバー&クライアントアプリケーションVCL+Indyデモ?
-
[解決済み] なぜRESTful Webサービスが必要なのか?