Azure App Service 認証で OAuth トークンを操作する

この記事では、App Service の組み込みの認証と認可 を使用しているときに OAuth トークンを操作する方法について説明します。

アプリ コードでのトークンの取得

サーバー コードからプロバイダー固有のトークンが要求ヘッダーに挿入されるので、これらのトークンに簡単にアクセスできます。 次の表は、可能なトークン ヘッダー名を示しています。

プロバイダー ヘッダー名
Microsoft Entra ID X-MS-TOKEN-AAD-ID-TOKEN
X-MS-TOKEN-AAD-ACCESS-TOKEN
X-MS-TOKEN-AAD-EXPIRES-ON
X-MS-TOKEN-AAD-REFRESH-TOKEN
Facebook トークン X-MS-TOKEN-FACEBOOK-ACCESS-TOKEN
X-MS-TOKEN-FACEBOOK-EXPIRES-ON
Google X-MS-TOKEN-GOOGLE-ID-TOKEN
X-MS-TOKEN-GOOGLE-ACCESS-TOKEN
X-MS-TOKEN-GOOGLE-EXPIRES-ON
X-MS-TOKEN-GOOGLE-REFRESH-TOKEN
Twitter X-MS-TOKEN-TWITTER-ACCESS-TOKEN
X-MS-TOKEN-TWITTER-ACCESS-TOKEN-SECRET

Note

これらのヘッダーは、さまざまな言語フレームワークによって異なる形式 (小文字や先頭文字が大文字など) でアプリ コードに提供される可能性があります。

クライアント コード (モバイル アプリやブラウザー内の JavaScript など) から、HTTP GET 要求を /.auth/me に送信します (トークン ストアを有効にする必要があります)。 返される JSON にはプロバイダー固有のトークンがあります。

Note

アクセス トークンはプロバイダー リソースへのアクセス用であるため、クライアント シークレットを使用してプロバイダーを構成する場合にのみ存在します。 更新トークンを取得する方法を確認するには、「更新アクセス トークン」を参照してください。

認証トークンを更新する

プロバイダーのアクセス トークン (セッション トークンではなく) が期限切れになった場合は、そのトークンを再度使用する前に、ユーザーを再認証する必要があります。 アプリケーションの /.auth/refresh エンドポイントに GET 呼び出しを行って、トークンの期限切れを回避することができます。 呼び出されると、App Service は認証されたユーザーのトークン ストア内のアクセス トークンを自動的に更新します。 アプリ コードによる後続のトークン要求で、更新トークンを取得します。 ただし、トークンの更新が動作するためには、トークン ストアにプロバイダーの更新トークンが含まれている必要があります。 更新トークンの取得方法は各プロバイダーによって文書化されていますが、次の一覧に概要を示します。

  • Google: access_type=offline クエリ文字列パラメーターを /.auth/login/google API 呼び出しに追加します。 詳しくは、Google の更新トークンに関する記事をご覧ください。

  • Facebook: 更新トークンを提供しません。 長期間維持されるトークンの有効期限は 60 日間です (Facebook のアクセス トークンの有効期限と延長に関するページをご覧ください)。

  • Twitter: アクセス トークンに有効期限はありません (Twitter OAuth の FAQ に関するページを参照してください)。

  • Microsoft: https://resources.azure.com で、次の手順を実行します。

    1. ページの上部にある [Read/Write] を選択します。

    2. 左側のブラウザーで、[subscriptions]><subscription_name>>[resourceGroups]><resource_group_name>>[providers]>[Microsoft.Web]>[sites]><app_name>>[config]>[authsettingsV2] に移動します。

    3. [編集] をクリックします。

    4. 次のプロパティを変更します。

      "identityProviders": {
        "azureActiveDirectory": {
          "login": {
            "loginParameters": ["scope=openid profile email offline_access"]
          }
        }
      }
      
    5. [Put] をクリックします。

    Note

    更新トークンが提供されるスコープは offline_access です。 それがどのように使用されるかについては、「チュートリアル: Azure App Service でユーザーをエンド ツー エンドで認証および承認する」を参照してください。 他のスコープは、既に App Service によって既定で要求されます。 これらの既定のスコープについては、「OpenID Connect のスコープ」を参照してください。

プロバイダーが構成されたら、トークン ストアで更新トークンを見つけ、そのアクセス トークンの有効期限を確認できます。

任意の時点でアクセス トークンを更新するには、任意の言語で /.auth/refresh を呼び出します。 次のスニペットでは、jQuery を使用して、JavaScript クライアントからアクセス トークンを更新します。

function refreshTokens() {
  let refreshUrl = "/.auth/refresh";
  $.ajax(refreshUrl) .done(function() {
    console.log("Token refresh completed successfully.");
  }) .fail(function() {
    console.log("Token refresh failed. See application logs for details.");
  });
}

ユーザーがアプリに許可されている権限を取り消すと、/.auth/me の呼び出しは 403 Forbidden 応答で失敗する可能性があります。 エラーを診断するには、アプリケーション ログで詳細を確認します。

セッション トークンの有効期限の猶予期間の延長

認証されたセッションは、8 時間後に期限切れになります。 認証されたセッションの期限が切れた後、既定で 72 時間の猶予期間があります。 この猶予期間内は、ユーザーを再認証せずにセッション トークンを App Service で更新できます。 セッション トークンが無効になったときに /.auth/refresh を呼び出すことができ、トークンの有効期限を自分で追跡する必要はありません。 72 時間の猶予期間が経過した後、ユーザーはもう一度サインインして有効なセッション トークンを取得する必要があります。

72 時間が十分な時間でない場合は、この有効期間を延長することができます。 有効期限を長期に延長すると、セキュリティに大きく影響する可能性があります (認証トークンが漏洩または盗難にあった場合など)。 したがって、既定の 72 時間のままにするか、延長期間を最小限の値に設定する必要があります。

既定の有効期間を延長するには、Cloud Shell で次のコマンドを実行します。

az webapp auth update --resource-group <group_name> --name <app_name> --token-refresh-extension-hours <hours>

Note

猶予期間は、ID プロバイダーからのトークンではなく、App Service で認証されたセッションにのみ適用されます。 有効期限が切れたプロバイダー トークンの猶予期間はありません。

次のステップ