保護されているBackend ServiceをAzure API Managementで使う

このエントリは2019/10/22現在の情報に基づいています。将来の機能追加・変更に伴い、記載内容との乖離が発生する可能性があります。

はじめに

先日までの一連のエントリでは、API Management(以下、APIM)で公開しているAPIに対してOAuth2やOpenID Connectを使って認証・認可する仕組みを確認したが、今度は保護されたバックエンドサービスをAPIとして公開する場合にどうするかを確認する。

この場合、以下の2方法が考えられる。

  1. API呼び出しに使われるBearer tokenを、そのままバックエンドサービスに渡しても問題ない場合
  2. バックエンドサービスがAPI呼び出しとは別の認証・認可のスキームを使っている場合

API Gatewayがリバースプロキシとして機能する場合、Authorizationなどのヘッダーはバックエンドに流通しないようなサービスや製品もある(ふつうはAuthorizationヘッダーを後段に伝播しない)が、APIMの場合は流通できる。そのため、1の場合はTokenを後段に伝播して個々のバックエンドサービスでTokenを解釈すればよく、APIMで考慮すべきポイントは特にない。

対して2の場合、バックエンドサービスとAPI Gateway間で認証・認可が確立している必要があるため、種々の方策が考えられる。何れにしても、Tokenをどのように取得し、付加してBackend serviceを呼び出すか、が肝。

基本認証の場合(そもそも認証じゃないけど)

authentication-basic ポリシーを使う。

基本認証 / Authenticate with Basic
https://docs.microsoft.com/azure/api-management/api-management-authentication-policies#Basic

証明書を使う場合

authentication-certificate ポリシーを使う。

クライアント証明書による認証 / Authenticate with client certificate
https://docs.microsoft.com/azure/api-management/api-management-authentication-policies#ClientCertificate

ドキュメントに記載の通り、事前にAPIMに証明書をアップロードしておく必要がある。証明書のアップロード方法は以下のドキュメントを参照。

クライアント証明書のアップロード / Upload a client certificate
https://docs.microsoft.com/azure/api-management/api-management-howto-mutual-certificates#-upload-a-client-certificate

認証に使う証明書は、thumbprintもしくはリソース名で指定する。

Managed Identityを使う場合

authentication-managed-identity ポリシーを使う。

なお、証明書やManaged Identityを使う方法が同じWebページに記載があるが、これらについては、別のエントリで記載する。

OAuth2やOpenID Connectの場合

そのものズバリのポリシーはないが、send-request ポリシーを使ったサンプルがドキュメントに掲載されている。

ゲートウェイとバックエンド間の承認に OAuth2 を使用する / Use OAuth2 for authorization between the gateway and a backend
https://docs.microsoft.com/azure/api-management/policies/use-oauth2-for-authorization

が、GitHubにも種々のサンプルがあるので、こちらを参考にして実装する(サンプルでしかないので、例外処理やテストは当然実施しなければならない)。

Azure API Management Policy Snippets
https://github.com/Azure/api-management-policy-snippets/tree/master/examples

他社製品やサービスの場合、バックエンドサービスの認証ポリシーにOAuth2に対応したものもあるのだが、APIMではまだの様子…。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中