2016-08-24 14 views
2

マイクロサービスアーキテクチャでの認証に関する質問があります。私は今、モノリシックなアプリケーションを持っています。私の目標は、小さなマイクロサービスでアプリケーションを分割することです。JWTとOpenID Connectを使用したマイクロサービスでのクライアント認証

私の最も大きな問題は、今のところ認証です。ドキュメントをたくさん読んだら、最善の解決策は、OpenID Connectを使用して、ユーザがマイクロサービスにリクエストを渡すことができるJWTを取得することを認証することです。

また、複数のエンドポイントが存在しないようにするには、エンドユーザーに対して1つのエンドポイントのみを持つAPIゲートウェイを展開します。さて、私はこのアーキテクチャに2つの質問があります。

認証のための標準的な流れは次のようになります。

ユーザーは、暗黙的な流れではOpenID Connectで私のアイデンティティサーバーに連絡し、id_token(JWT)ともaccess_tokenはを取得します。ユーザーはこのaccess_tokenでAPIにアクセスできるようになりました。 APIゲートウェイは、ID情報サーバでaccess_tokenを更新し、JWTを取得して、それをサブリクエストに追加してマイクロサービスAPIに追加します。

1/API Gatewayがaccess_tokenからJWTを取得する方法は?ドキュメント(http://openid.net/specs/openid-connect-core-1_0.html)の赤い部分から、 "/ userinfo"エンドポイントに連絡できますが、JWTではなくJSON形式になります。

2 /私のマイクロサービス間の認証された呼び出しを許可します。したがって、各マイクロサービスは、他のマイクロサービスと直接接触するためにJWTを生成することができる必要があります。私の最初の考えはアイデンティティ・サーバーに連絡することでした。しかし、OAuth2 Client Credentialsフローでは、id_tokenまたはJWTを取得しません。 JWTのない古典的なOAuth2アクセストークン。第2の考えは、マイクロサービスが、IDサーバによって使用されるものと同じPKIによって発行された証明書を用いて、自身のJWTに直接署名することができるということでした。つまり、JWTは複数の証明書で署名できますが、同じプライベートPKIから署名できます。マイクロサービスがJWTを受け取るとき、それはJWTに署名するために使用された魔法証明書を識別することができる必要があります。私はこの問題に関してRFC上何も見つけられません。トークンに自分のプライベートクレームを追加して証明書を取得することもできますが、この種のソリューションを見ずに数日間Webをブラウズした後、私が間違った経路にいないかどうか疑問に思っています。 JWTで「サービスからサービスへ」の認証と「サービスからサービスへ」認証することができますか?

ありがとうございました!

答えて

3

私は同様のソリューションを実装しています。それは完全にあなたの質問に対処しますかどうかわからない、しかし、私はそれが役に立てば幸い:

  1. あなたののOAuth2アクセストークンは、JWTトークンに変換するために、新しい認証マイクロ・サービスを実装することができます。このマイクロサービスは、このJWTトークンにも署名します。

  2. APIゲートウェイはすべてのクライアント要求を認証サービスにルーティングします。認証サービスはIDMからこのトークンを検証し、署名されたJWTトークンに変換します。

  3. APIゲートウェイは、このJWTトークンを認証サービスの公開鍵からの署名を検証する他のマイクロサービスに渡します。署名が検証されると、認可のために役割を抽出できます。

  4. 各マイクロサービスは独自のIDM認証情報を設定できます。他のマイクロサービスを呼び出す場合は、アクセストークンを生成して認証サービスを呼び出して、他のマイクロサービスへの呼び出しで渡すことができるJWTを取得できます。

関連する問題