web-dev-qa-db-ja.com

マイクロサービス認証

コンテキスト

私は次のような複数のサービスを持っています:

  • ユーザー(LDAPまたはActive Directoryなど...)
  • 請求
  • 計画
  • 等...
  • 認証

まず、標準のログイン/パスワードを使用して、OAuth2.0を使用してマイクロサービスに接続する必要があります(私は自分のデータを使用し、サードレッグサーバーを取得しません)

問題

これらの写真によると:

ステップ1

enter image description here

ステップ2

enter image description here

Authmicroservice以外のサービスでaccess_token制御または承認制御を処理するにはどうすればよいですか?

20
mfrachet

マイクロサービスアーキテクチャで認証を管理するには、別の視点が必要です。

モノリスで作業したときは、単一​​の認証プロセスがあったことを思い出してください。

PHPアプリの例として、対応する資格情報を持つデータベースでユーザーを見つけ、ユーザーが「認証」されたセッションを作成しました。

マイクロサービスでは、ワークフローは少し同じです。現在変更されているのは、別のサービスでセッションを開くことができないことだけです。さらに、認証されたユーザーを取得する必要はありません。彼がマイクロサービスで現在の呼び出しを実行する権限を持っていることを確認するだけで済みます。

Oauth2のおかげで、有効なaccess_tokenを持っていると、この情報が得られます。

これはフロントエンド部分に答えるはずです。バックエンド部分(つまり、APIゲートウェイの背後)では、access_tokenはマイクロサービスに関連しないため、管理しないでください。ファンクションキーを使用して、たとえばuuidなどのマイクロサービス内のユーザーに関連する情報を見つけることができます。

Oauth2の使用中にuuidを取得するには、openidconnectも使用することをお勧めします。特定のユーザー情報を管理するのはこのプロトコルのユーザーであり、特定のエンドポイント「/ userinfo」へのアクセスを提供します。

このスキーマがこの答えをより明確にすることを願っています。

enter image description here

11
David Level

手順1で示したように、access_tokenを提供する個別のAuthサービスを作成することは可能です。ただし、API Gatewayでは、トークンを検証するために、各サービスがそのauthサービスを呼び出す必要があります。私の製品にも使用しているAPIGateway内でoauthプロセスを適用するのが最善であり、このアプローチは多くの記事でも説明されています。下の画像を見てみましょう。

inlined image

技術的な観点からは、リクエストヘッダーを処理するコード(関数)の一部で、oauth認証として提供されるトークンを検証します。これは、コード内で処理されるか、リクエストを転送する前に独自のデータベースにアクセスすることで処理されます。サービスのエンドポイントへ。

1つの方法に従って、拡張API Gatewayのサービスのいずれかによって、認証、セキュリティ、およびエンドポイントへのリクエストディスパッチを提供できます。 stackoverflowですでに質問があります ここ 、しかし私が簡単に理解できるのは、3つまたは4つの一連のチュートリアルです ここ

作業するマイクロサービスに集中する前に、APIGatewayの使用状況を明確に把握してください。

1
AHashmi

アクティベーターのマイクロサービスの認証フローのチュートリアルと説明があります。Scala — http://www.typesafe.com/activator/template/reactive-microservices (ソース: https://github.com/theiterators/reactive-microservices


基本的な考え方は次のとおりです。すべてのリクエストに対して認証トークンの信頼性を検証する必要があります。次のいずれかを実行できます。

—プロキシ(ゲートウェイ)で実行します

—課金マイクロサービス内で実行します


私たちが行う傾向があるのは、クライアント向けのすべてのマイクロサービス内でAuth-Tokenを検証することです。

— Auth-Token toUser情報をRedisインスタンス内に保持します。

—クライアント向けサービスは、このトークンが有効かどうかをredisインスタンスに尋ねます

— redisは、さらなる承認のためのユーザーデータとして使用できるJSON文字列を返します。

したがって、サーバー側のフローは次のようになります

get("projects/" / Segment) { projectName =>
  getHeader("Auth-Token") { authToken =>
    Redis.get("auth:token:#{authToken}").map { userJson =>
      if(userJson("projects").include(projectName)) {
        ...processSth...
        Ok
      } else {
        Unauthorized
      }
    }
  }
}
0
Jacek Głodek

マイクロサービスをどのように構成しているかによっては、構成を利用することもできます。

すでに認証サービスがあるので、請求サービス内でそれを使用して、リクエストを処理する前にリクエストの信頼性を確認できます。

たとえば、 StdLib (社内で使用)のようなプラットフォームを使用している場合:

// Billing
const lib = require('lib');

module.exports = function(params, callback) {
  lib.user.isAuthenticated(params, function(err, user) {
    if (err) return callback(err);
    // Do stuff with user, process billing
  });
};

関数間の通信に常にHTTPを使用している場合、これは適切なアイデアではない可能性があります(これにより、要求に200〜300ミリ秒が追加される可能性があるため)。しかし、StdLibは同じエリア内にいくつかのサービスをロードし、基本的にその問題を解決する関数のようにそれらにアクセスできます(少なくとも、これまで見てきた限りでは)。

0
Nima Gardideh