次の方法で共有


Azure Static Web Apps でのユーザー情報へのアクセス

Azure Static Web Apps では、直接アクセス エンドポイントおよび API 関数を介して、認証関連のユーザー情報が提供されます。

多くのユーザー インターフェイスは、ユーザー認証データに大きく依存しています。 直接アクセス エンドポイントは、カスタム関数を実装する必要なしにユーザー情報が公開されるユーティリティ API です。 便利さ以外に、直接アクセス エンドポイントは、サーバーレス アーキテクチャに付きもののコールド スタートの遅延による影響を受けません。

この記事では、デプロイされたアプリケーションからユーザー情報を読み取る方法について説明します。 ローカル開発中にエミュレートされたユーザー情報を読み取る場合は、「承認と認証のエミュレーション」を参照してください。

クライアント プリンシパル データ

クライアント プリンシパル データ オブジェクトでは、ユーザーを特定できる情報がアプリに公開されます。 クライアント プリンシパル オブジェクトには、次のプロパティが含まれます。

プロパティ 説明
identityProvider ID プロバイダーの名前。
userId Azure Static Web Apps 固有のユーザーの一意識別子。
  • 値は、アプリごとに一意です。 たとえば、同じユーザーでも、異なる Static Web Apps リソースでは異なる userId 値が返されます。
  • 値は、ユーザーの有効期間にわたって保持されます。 ユーザーを削除し、同じユーザーをアプリに再び追加すると、新しい userId が生成されます。
userDetails ユーザーのユーザー名またはメール アドレス。 ユーザーのメール アドレスを返すプロバイダーもあれば、ユーザー ハンドルを送信するプロバイダーもあります。
userRoles ユーザーに割り当てられたロールの配列。
claims カスタム認証プロバイダーによって返されるクレームの配列。 直接アクセス エンドポイントでのみアクセスできます。

クライアント プリンシパル オブジェクトの例を次に示します。

{
  "identityProvider": "github",
  "userId": "abcd12345abcd012345abcdef0123450",
  "userDetails": "username",
  "userRoles": ["anonymous", "authenticated"],
  "claims": [{
    "typ": "name",
    "val": "Azure Static Web Apps"
  }]
}

直接アクセス エンドポイント

/.auth/me ルートに GET 要求を送信し、クライアント プリンシパル データへの直接アクセスを受け取ることができます。 ビューの状態が承認データに依存している場合は、この方法を使用すると最適なパフォーマンスが得られます。

ログインしているユーザーの場合、応答にはクライアント プリンシパルの JSON オブジェクトが含まれます。 認証されていないユーザーからの要求では、null が返されます。

fetch1 API を使用すると、次の構文を使用してクライアント プリンシパル データにアクセスできます。

async function getUserInfo() {
  const response = await fetch('/.auth/me');
  const payload = await response.json();
  const { clientPrincipal } = payload;
  return clientPrincipal;
}

(async () => {
console.log(await getUserInfo());
})();

API 関数

Azure Functions バックエンドを介して Static Web Apps で使用できる API 関数では、claims 配列を除き、クライアント アプリケーションと同じユーザー情報にアクセスできます。 API では、ユーザーを特定できる情報を受け取りますが、ユーザーが認証されているか、必要なロールと一致する場合は、独自のチェックを実行しません。 アクセス制御規則は、staticwebapp.config.json ファイルで定義されています。

クライアント プリンシパル データは、x-ms-client-principal 要求ヘッダーで API 関数に渡されます。 クライアント プリンシパル データは、シリアル化された JSON オブジェクトを含む Base64 でエンコードされた文字列として送信されます。

次の関数の例では、ユーザー情報を読み取って返す方法を示します。

module.exports = async function (context, req) {
  const header = req.headers.get('x-ms-client-principal');
  const encoded = Buffer.from(header, 'base64');
  const decoded = encoded.toString('ascii');

  context.res = {
    body: {
      clientPrincipal: JSON.parse(decoded),
    },
  };
};

上の関数の名前が user であるとすると、fetch1 ブラウザー API を使用し、次の構文を使用して API の応答にアクセスできます。

async function getUser() {
  const response = await fetch('/api/user');
  const payload = await response.json();
  const { clientPrincipal } = payload;
  return clientPrincipal;
}

console.log(await getUser());

ユーザーがログインすると、Static Web Apps エッジ ノードを介してユーザー情報の要求に x-ms-client-principal ヘッダーが追加されます。

Note

API 関数でアクセスできる x-ms-client-principal ヘッダーには、claims 配列は含まれていません。

1fetch API と await 演算子は、Internet Explorer ではサポートされていません。

次のステップ