전경
우리는 단일 플랫폼에서보다 서비스 지향 아키텍처로 이동하고 있습니다. 우리는 매우 기본적인 DDD 원칙을 적용하고 우리의 영역을 서로 다른 범위의 컨텍스트로 나누고 있습니다. 각 도메인은 웹 API (REST)를 통해 분산되어 서비스를 제공합니다.
비즈니스의 특성상 예약 , 서비스 , 고객 , 제품 등과 같은 서비스가 있습니다 .
또한 주요 역할이 다음과 같은 Identity Server (Thinktecture Identity Server 3 기반)를 설정했습니다.
- 중앙 집중식 인증 (토큰을 발급 한 자격 증명 제공)
- 다음과 같은 토큰에 클레임을 추가하십시오. 클라이언트의 범위 (클라이언트 당 요청을하는 응용 프로그램을 의미 함), 고객 식별자 (고객 당 응용 프로그램을 사용하는 사람을 의미 함)
또한 서비스에 대한 외부 액세스를 중앙 집중화 하는 API 게이트웨이 의 역할을 소개했습니다 . API Gateway는 다음과 같은 내부 도메인에 대한 깊은 지식이 필요하지 않은 기능을 제공합니다.
- 리버스 프록시 : 들어오는 요청을 적절한 내부 서비스로 라우팅
- 버전 관리 : API Gateway 버전이 다른 버전의 내부 서비스에 매핑됩니다.
- 인증 : 클라이언트 요청에는 Identity Server에서 발급 한 토큰이 포함되며 API Gateway는 토큰의 유효성을 검사합니다 (사용자가 자신이 누구인지 확인)
- 제한 : 클라이언트 당 요청 수 제한
권한 부여
권한 부여와 관련하여 이는 API 게이트웨이가 아니라 내부 서비스 자체에서 관리됩니다. 현재 2 가지 주요 인증 유형을 수행하고 있습니다.
- 클라이언트 범위에 따른 권한. 예 : 클라이언트 (우리의 API를 소비하는 외부 애플리케이션)는 Bookings 서비스 API 엔드 포인트에 액세스하기 위해 "bookings"범위가 필요 합니다.
- 고객에 따른 권한. 예 : 고객 (애플리케이션을 사용하는 실제 사람)이 예약의 참가자 인 경우에만 예약 서비스 에서 엔드 포인트 GET / 예약에 액세스 할 수 있습니다.
내부 서비스에서 권한 부여를 처리 할 수 있도록 API Gateway는 단순히 클라이언트 (요청을 수행하는 애플리케이션) 및 고객 (클레임)에 대한 정보를 포함하는 토큰 (요청을 내부 서비스로 라우팅 할 때)을 전달합니다. 개인이 클라이언트 응용 프로그램에 로그인 한 경우).
문제 설명
지금까지 서비스 간 통신을 도입 할 때까지는 좋았습니다 (일부 서비스는 다른 서비스와 통신하여 일부 데이터를 얻을 수 있음).
질문
서비스 간 통신에서 인증에 어떻게 접근해야합니까?
고려 된 옵션
다른 옵션을 논의하기 위해 다음 샘플 시나리오를 사용합니다.
- 예약 흐름을 구축하기 위해 API에 액세스하는 ExternalApp 이라는 외부 응용 프로그램이 있습니다 ( ExternalApp 은 클라이언트 로 볼 수 있음 )
- ExternalApp 은 Bookings 서비스에 액세스해야 하므로 ExternalApp 에 "bookings"범위를 부여합니다.
- 내부적으로 (이것은 ExternalApp에 대해 완전히 투명한 것입니다 ) Bookings 서비스 는 항공편, 보험 또는 렌터카와 같은 예약의 기본 서비스를 얻기 위해 서비스 서비스를 필요로합니다.
이 문제를 내부적으로 논의 할 때 몇 가지 옵션이 나타 났지만 어떤 옵션이 가장 적합한 지 잘 모르겠습니다.
- 때 예약이 와 통신 서비스 , 단순히 앞으로 그가 API 게이트웨이에서받은 토큰 원래해야한다 (클라이언트가 있음을 나타내는 ExternalApp )
- 시사점 : 허용 되지 않아야 하는 범위를 ExternalApp 에 부여해야 할 수 있습니다 . 예 : ExternalApp 에는 "bookings"및 "services"범위가 있어야하지만 "bookings"범위 만 있으면 충분합니다.
- Bookings 가 Services 와 통신 할 때 클라이언트가 이제 ExternalApp 대신 Bookings 가되었음을 나타내는 토큰을 전달하고 Bookings 가 원래 클라이언트 ExternalApp을 가장하고 있음을 나타내는 클레임을 추가합니다.
- 또한 원래의 클라이언트가 있다는 정보를 포함하여 ExternalApp 서비스 서비스는 또한 원래의 호출에 따라 일부 서비스를 필터링으로 논리를 할 수있는 (예 : 내부 애플리케이션을 위해 우리는 일부 외부 애플 리케이션을위한 모든 싸움을 반환해야합니다)
- 서비스는 서로 통신해서는 안됩니다 (따라서 우리는이 질문에 직면하지 않아야합니다)
입력 해 주셔서 감사합니다.