はじめに
業務でシークレット値を使ったトークン取得を実装したため、忘れないようにメモです。
やりたいこと
Document Intelligenceの結果を返してくれるWebAPIを作ったので、これを他のアプリから呼び出して使いたい…
でもDocument IntelligenceにはAuthorization属性がついている…
(どちらも.NET6でつくったC#Webアプリ)
アプリケーション登録
認証をかけたWebAPIをアプリ登録します。(上の図だとDocument Intelligence)
今回Azure AD B2Cの環境で作りましたが、もちろんAzure ADでも大丈夫です。
シークレットの作成
認証で必要になるため、「新しいクライアントシークレット」を作成します。
APIの公開
アプリケーションにする設定は以上です。
コード
認証をかけたWebAPI(Document Intelligence WebAPI)を使いたいアプリ側に以下のコードを追加します。
ドメイン・テナントID・クライアントID・生成したシークレット値は👆で登録したアプリの値です。
appsettings.json
"DocumentIntelligence": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "ドメイン",
"TenantId": "テナントID",
"ClientId": "クライアントID",
"CallbackPath": "/signin-oidc",
"SignedOutCallbackPath ": "/signout-callback-oidc",
"ClientSecret": "生成したシークレット値"
}
private async Task<string> GetTokenAsync()
{
try
{
ConfidentialClientApplicationOptions applicationOptions;
applicationOptions = new ConfidentialClientApplicationOptions();
_configuration.Bind("DocumentIntelligence", applicationOptions);
IConfidentialClientApplication app;
app = ConfidentialClientApplicationBuilder.CreateWithApplicationOptions(applicationOptions).Build();
var acquireToken = app.AcquireTokenForClient(new List<string> { "https://{domain}/{clientId}/.default" });
var authenticationResult = await acquireToken.ExecuteAsync();
return authenticationResult.AccessToken;
}
catch (Exception)
{
throw;
}
}
実行すると、これでトークンが取得できました。