解決方法がわからない設計上の問題があります。
私のメインアプリケーションは 6 つのモジュールで構成されているとします。
- クライアント
- ゲートウェイ
- 認証サービス
- フォーラム
- ギャラリー
- メッセージ
クライアントはゲートウェイ サービスとのみ通信することになっています。
ゲートウェイでユーザー認証(理想的には JWT になる)を行い、他の 3 つのプロダクティブ サービス(フォーラム、ギャラリー、メッセージ)ではトークンを検証して権限とロールを取得するだけでよいのでしょうか。彼らは自らを管理するその特定のユーザーに対してですか?
いくつかのトラブルを説明するために、シーケンス図を作成します。
ここをクリックオリジナルのdraw.ioグラフィックをご希望の場合は、こちらをクリックしてください。
サードパーティの認証サービスは一切使用しません。認証サービス (ほぼ完成しています) でユーザーを登録し、ログインできるようにしたいだけです。それとも、そのサービスでも権限とロールを管理する必要がありますか?
私はこの問題について何ヶ月も頭を悩ませてきましたが、ユーザーが登録、ログイン/ログアウトし、さまざまな生産的なサービスと通信できるようにする適切な構造がどうしても見つかりません。現在、バックエンドには Java を使用していますが、マイクロサービスの良いところは、すべてに 1 つのプログラミング言語を使用する必要がないことです。
どのような助けでも歓迎します!
Ps: 私は読んだマイクロサービス認証戦略そしてZuul - API ゲートウェイ認証ですが、私の場合にはどちらも当てはまらないようです。
ベストアンサー1
私は以下の設定で作業しましたが、非常にうまくいきました。
ログインフロー:
- 新しいブラウザが特定のリソースをリクエストする
- ゲートウェイサービスはjwtクッキーが存在しないことを検出し、ログインフォームにリダイレクトします。
- ログインフォームはゲートウェイ経由で認証サービスと通信します。ゲートウェイは認証サービスへの非 JWT 呼び出しのみを許可します。
- 認証サービスはログインフォームに新しく作成されたjwtクッキーを提供し、元のURLにリダイレクトします。
通常操作:
- ブラウザはjwtクッキーとともにリソースをリクエストします
- ゲートウェイサービスはリクエストをインターセプトし、検証のためにjwtを認証サービスに転送します。
- 認証サービスは署名、タイムスタンプ、ブラックリストをチェックし、肯定的または否定的な結果を返します。
- 肯定的な場合、ゲートウェイサービスはリクエストをそれぞれのバックエンドサービスに転送し、否定的な場合はログインにリダイレクトします。
- バックエンド サービスは JWT 検証を実行せず、ゲートウェイを信頼して有効なリクエストのみを送信します。
- バックエンドサービスは、jwt で定義されたロール/権限/権限をチェックします。
ログアウトフロー:
- ブラウザは認証サービス/ログアウトにリクエストを送信します
- 認証サービスはjwtをブラックリストに入れてログインフォームにリダイレクトします
さて、これは私たちがサードパーティの助けをほとんど
受けずに実装したシンプルなワークフローです 。ある時点ではセッション クッキーを使用する必要がありましたが、それは別の理由によるものです。認証サービスのブラックリストを除いて、システムはほぼステートレスであることに注意してください。jwt では単純にログアウトするわけではありません。ブラックリストを管理するために REDIS を使用しました。ゲートウェイまたは認証サービスでセッション クッキーを使用してログアウトを実装できます。
バックエンド サービスのほとんどは、jwt に独自のロール/権限/資格のセットを期待していました。ロールは認証サービスによってユーザーに付与され、付与された jwt に書き込まれました。新しいロールがユーザーに付与された場合、その権限を反映するにはユーザーはログオフ/ログオンする必要がありました。一部の権限が削除された場合、ユーザーは強制的にログオフする必要がありました。そこで REDIS が役立ちました。