Azure App Service 認証で OAuth トークンを操作する
この記事では、App Service の組み込みの認証と認可 を使用しているときに OAuth トークンを操作する方法について説明します。
アプリ コードでのトークンの取得
サーバー コードからプロバイダー固有のトークンが要求ヘッダーに挿入されるので、これらのトークンに簡単にアクセスできます。 次の表は、可能なトークン ヘッダー名を示しています。
プロバイダー | ヘッダー名 |
---|---|
Microsoft Entra | 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 |
X-MS-TOKEN-GOOGLE-ID-TOKEN X-MS-TOKEN-GOOGLE-ACCESS-TOKEN X-MS-TOKEN-GOOGLE-EXPIRES-ON X-MS-TOKEN-GOOGLE-REFRESH-TOKEN |
|
x | 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 のアクセス トークンの有効期限と延長に関するページをご覧ください)。
X: アクセス トークンに有効期限はありません (「OAuth に関する FAQ」を参照)。
Microsoft: https://resources.azure.com で、次の手順を実行します。
ページの上部にある [Read/Write] を選択します。
左側のブラウザーで、[subscriptions]><subscription_name>>[resourceGroups]><resource_group_name>>[providers]>[Microsoft.Web]>[sites]><app_name>>[config]>[authsettingsV2] に移動します。
[編集] をクリックします。
次のプロパティを変更します。
"identityProviders": { "azureActiveDirectory": { "login": { "loginParameters": ["scope=openid profile email offline_access"] } } }
[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 で認証されたセッションにのみ適用されます。 有効期限が切れたプロバイダー トークンの猶予期間はありません。