🐷

SWAで任意のGitHubリポジトリーのアクセス権を持つユーザーのみをアクセスできるように頑張ったけどダメだった

に公開

Azure Static Web Apps(SWA)で「GitHubリポジトリ権限を持つ人だけがサイト全体にアクセスできる」を実現しようとして、最終的に断念した記録です。

結論から言うと、プロダクションとPRステージング(プレビュー環境)の両方で、SWA標準機能だけに寄せて同じ方式で成立させるのが難しいためです。

目的

  • 認証:GitHubでログイン
  • 認可:特定のGitHubリポジトリ(またはOrg)に権限があるユーザーだけ許可
  • 範囲:サイト全体(静的ファイル含む)
  • 環境:プロダクション+PRステージング

方針(rolesSourceによる動的ロール付与)

SWAの staticwebapp.config.json で、次のように作るつもりでした。

  • auth.rolesSource/api/roles を呼び出してロールを返します
  • GitHub AppのインストールトークンでGitHub APIを叩き、権限があれば repo-reader を付与します
  • /*allowedRoles: ["repo-reader"] にしてサイト全体をブロックします

発生事象

rolesSourceが期待どおり動きませんでした

関数そのものはデプロイでき、config未適用の状態では /api/roles が 200 で応答しました。
しかし、configを適用して rolesSource を有効にすると、ログイン後もロールが付与されず 403 のままでした。診断用に「常に repo-reader を返す」実装にしても同じでした。

要するに、rolesSource経由で関数が呼ばれている痕跡が取れませんでした

Standardプランでauthセクションを書いた瞬間にログインが404になりました

Standardプランで auth セクション(rolesSourceを含む)を書いたところ、/.auth/login/github が 404 になりました。auth を消すと復活しました。

調べると、rolesSourceはカスタム認証(custom authentication)の文脈の機能で、設定の仕方によっては Managed Auth側のプロバイダーが無効化され得ることが分かりました。

PRステージングのURLが不定で、GitHub OAuthのコールバック登録と衝突します

仮に Standard + カスタムGitHubプロバイダーで押し切るとしても、PRステージング(プレビュー環境)のURLは事前に固定できません。
一方で、GitHub OAuthは redirect_uri を厳密に扱うため、コールバックURLを事前登録できない環境は成立しません。

このため、「プロダクション+PRステージングの両方で、サイト全体をGitHub権限で守る」を同一方式で成立させるのが難しいという結論になりました。


まとめ

  • rolesSource は Managed Auth と気軽に組み合わせられる機能ではなく、カスタム認証の前提条件が強いです
  • Standardで auth を書くと、ManagedのGitHubログインが404になる症状に当たりました
  • PRステージングのURL不定と、GitHub OAuthのコールバック登録要件が衝突します

参考リンク

Discussion