認証トークンをキャッシュする方法

この記事では、アプリケーションのパフォーマンスを高めるために認証トークンをキャッシュする方法について説明します。

ASP.NET を使用する

トークンの取得に使用される Microsoft.Identity.Client NuGet パッケージをインポートします。 詳細については、「Identity Client NuGet パッケージのインストール」を参照してください。

機密クライアント アプリケーション プロパティを作成します。

private IConfidentialClientApplication _confidentialClientApplication;
private IConfidentialClientApplication ConfidentialClientApplication
{
    get {
        if (_confidentialClientApplication == null) {
            _confidentialClientApplication = ConfidentialClientApplicationBuilder.Create(ClientId)
            .WithClientSecret(ClientSecret)
            .WithAuthority($"https://login.windows.net/{TenantId}")
            .Build();
        }

        return _confidentialClientApplication;
    }
}

次に、以下のコードを使用して AuthenticationResult を取得します。イマーシブ リーダー リソースを作成するときに取得した認証値を使用してください。

重要

Microsoft.IdentityModel.Clients.ActiveDirectory NuGet パッケージと Azure AD認証ライブラリ (ADAL) は非推奨となりました。 2020 年 6 月 30 日以降、新しい機能は追加されていません。 アップグレードすることを強くお勧めします。 詳細については、移行ガイドを参照してください。

public async Task<string> GetTokenAsync()
{
    const string resource = "https://cognitiveservices.azure.com/";

    var authResult = await ConfidentialClientApplication.AcquireTokenForClient(
        new[] { $"{resource}/.default" })
        .ExecuteAsync()
        .ConfigureAwait(false);

    return authResult.AccessToken;
}

AuthenticationResult オブジェクトには、AccessToken プロパティがあります。このプロパティが、SDK を使用して Immersive Reader を起動する際に実際に使用することになるトークンです。 また、トークンの有効期限を示す ExpiresOn プロパティもあります。 Immersive Reader を起動する前に、トークンの有効期限が切れているかどうかを調べ、切れている場合にのみ新しいトークンを取得することができます。

Node.JS を使用する

request npm パッケージをプロジェクトに追加します。 以下のコードで、イマーシブ リーダー リソースを作成するときに取得した認証値を使用してトークンを取得します。

router.get('/token', function(req, res) {
    request.post(
        {
            headers: { 'content-type': 'application/x-www-form-urlencoded' },
            url: `https://login.windows.net/${TENANT_ID}/oauth2/token`,
            form: {
                grant_type: 'client_credentials',
                client_id: CLIENT_ID,
                client_secret: CLIENT_SECRET,
                resource: 'https://cognitiveservices.azure.com/'
            }
        },
        function(err, resp, json) {
            const result = JSON.parse(json);
            return res.send({
                access_token: result.access_token,
                expires_on: result.expires_on
            });
        }
    );
});

expires_on プロパティはトークンの有効期限が切れる日時で、1970 年 1 月 1 日 (UTC) からの経過秒数として表されます。 新しいトークンを取得する際は、この値を使用して、トークンの有効期限が切れているかどうかを事前に調べてください。

async function getToken() {
    if (Date.now() / 1000 > CREDENTIALS.expires_on) {
        CREDENTIALS = await refreshCredentials();
    }
    return CREDENTIALS.access_token;
}

次のステップ