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側のプロバイダーが無効化され得ることが分かりました。
- https://learn.microsoft.com/ja-jp/azure/static-web-apps/authentication-custom
- https://github.com/Azure/static-web-apps/issues/836
PRステージングのURLが不定で、GitHub OAuthのコールバック登録と衝突します
仮に Standard + カスタムGitHubプロバイダーで押し切るとしても、PRステージング(プレビュー環境)のURLは事前に固定できません。
一方で、GitHub OAuthは redirect_uri を厳密に扱うため、コールバックURLを事前登録できない環境は成立しません。
- プレビュー環境はカスタムドメインが使えません:
https://learn.microsoft.com/en-us/azure/static-web-apps/preview-environments - GitHub OAuthのredirect制約:
https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps
このため、「プロダクション+PRステージングの両方で、サイト全体をGitHub権限で守る」を同一方式で成立させるのが難しいという結論になりました。
まとめ
-
rolesSourceは Managed Auth と気軽に組み合わせられる機能ではなく、カスタム認証の前提条件が強いです - Standardで
authを書くと、ManagedのGitHubログインが404になる症状に当たりました - PRステージングのURL不定と、GitHub OAuthのコールバック登録要件が衝突します
参考リンク
-
SWA custom authentication / rolesSource
-
SWA preview environments(カスタムドメイン制約)
-
GitHub OAuth redirect_uri 制約
-
関連Issue
Discussion