このエントリは2023/12/19現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。
Azure API Management (以後、APIM) はAPIサービスの認証(フロントエンドの認証)と、バックエンドサービス用の認証・認可機構を有している。今回は後者についての備忘録。
資格情報マネージャーとは
API 資格情報と資格情報マネージャーについて / About API credentials and credential manager
https://learn.microsoft.com/azure/api-management/credentials-overview
平たく言うと、バックエンドサービス接続のための認証・認可のしくみ(Basic Authポリシーは存在するが、もはやこれは認証ではなく、ただの気休めでしかない)。OAuth 2.0 を使用する 1 つまたは複数のバックエンド サービスや SaaS サービスに関して横断的にユーザー、グループ、サービス プリンシパルの認証と承認を行うプロセスを大幅にシンプル化できる。
- OAuth 2.0 を使用する SaaS プロバイダーやバックエンド サービスに対応
- 有人(Attended、ユーザー委任)、無人(Unattended)のシナリオに対応


接続の管理
OAuth 2.0 トークン用資格情報プロバイダーのセットアップと構成、ID プロバイダー用の同意フローの有効化、および、資格情報アクセス用に資格情報プロバイダーへの接続を 1 つまたは複数セットアップできる。grant typeとしてAuthorization codeを使った接続作成シーケンスは以下の通り。

https://learn.microsoft.com/azure/api-management/credentials-process-flow#management-of-connections
資格情報プロバイダー
資格情報プロバイダー構成時に、OAuth ProviderとGrant type (Authorization codeもしくはUser credentials) を選択できる。 構成は各Providerごとに実施する。以下は注意点。
- 1 つの資格情報プロバイダーの構成で使用できるGrant typeは 1 つだけ
- 1 つの資格情報プロバイダー構成に複数の接続を設定可能
- Grant typeとしてAuthorization codeを使う場合、接続にあたってユーザーの同意が必要
GitHub APIを呼び出すために資格情報プロバイダーを構成する
手順は以下のドキュメントの通りだが、確認のため設定を辿っておく。
資格情報マネージャーの構成 – GitHub API / Configure credential manager – GitHub API
https://learn.microsoft.com/azure/api-management/credentials-how-to-github
GitHub側の構成
1) Settings > Developer Settings > OAuth Apps で [New OAuth App] をクリックして、必要な情報を入力し、[Register application]をクリック
ここで、コールバックURL(リダイレクトURL)は以下の書式に従う。
https://authorization-manager.consent.azure-apim.net/redirect/apim/<APIMサービス名>
2) [Application created successfully]という表示とともに、Client IDが出てくるのでメモしておく。
3) [Generate a new client secret]をクリックして新たにシークレットを生成しコピーする。なお、表示されたシークレットはこのタイミングでしか表示されないのでさくっとメモを取っておく(つまりUIを更新するなどしたらもう見えなくなる、ということ)。


APIM側の構成
1) Azure Portalの左側のメニュー > Credential Manager を選択し、+Createをクリックする。
2) 資格情報プロバイダー の作成ページで、必要な情報を入力する。
- Grant Type: Authorization code
- Client ID: 先ほどメモしたもの
- Client secret: 先ほどメモしたもの
- Scopes: 今回はuser
3) CreateをクリックするとリダイレクトURLが表示されるので、GitHub側で登録したURLと一致することを確認しておく。
4) Connection name(接続名)を指定してSaveをクリックして保存
5) 保存すると、「Step 2: Logic to your connection」(手順 2: 接続にログインする)という表示が現れるので、【Login with GitHub】をクリックしてログインしておく。ログインが完了すると、UnconnectedからConnectedに表示が変わる。



APIの作成
基本的にドキュメントの流れに沿って作成すればよいが、get-authorization-contextポリシーに指定する値には注意が必要。
- provider-id: Credential provider name
- authorization-id: Connection name
<policies>
<inbound>
<base />
<get-authorization-context
provider-id="{Credential Provider name (この例だとapim-github)}"
authorization-id="{Connection name (この例だとapim-github)}"
context-variable-name="auth-context"
identity-type="managed"
ignore-error="false" />
<set-header name="Authorization" exists-action="override">
<value>@("Bearer " + ((Authorization)context.Variables.GetValueOrDefault("auth-context"))?.AccessToken)</value>
</set-header>
<set-header name="User-Agent" exists-action="override">
<value>API Management</value>
</set-header>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
これでおしまい。

Let’s try it!
テスト自体はドキュメントの通りやれば問題なく動作するが、今回はlist reposというAPIを作成したのでこれを試してみる。このAPIは、筆者が持つリポジトリのリストを出力するもの。
