astro-supa-auth-database

Astro Supa Auth Database

astro supabase oauth database svelte

目的

AstroとSupabaseを使用したユーザー認証とwebアプリケーションのデプロイ動作検証である。

app概要

create astro@latest -- --template basicsとSupabaseで構築されたwebアプリケーションプロジェクトです。

  • 登録、ログイン、ログアウトの認証
  • 認証はSupabaseのauthを使用
  • DBはSupabaseのdatabaseを使用
  • emailとpassword認証とソーシャルOAuth認証を使う
  • フォームはJSとsvelteの2つ
  • フォームのバリデーションもJSとzodの2つ
  • ログイン後はsvelteを使用
  • ミドルウェアによる認証状態管理
  • svelteのstoreによるDBデータ状態管理
  • ヘッダー変化はastroとsvelteの2つ
  • デプロイ先はnetlify

開発環境

  • astro 4.1.1
  • svelte 4.2.8
  • supabase 2.39.3
  • zod 3.22.4
/ 
├── public 
├── src
│    │── components
│    │── layouts
│    │── lib
│    │── pages
│    │     │─── api
│    │     │     │──── auth
│    │     │     └──── database
│    │     └────────── callback
│    │── store
│    │── types
│    └── middleware.ts
├── astro.config.mjs
├── tsconfig.json
└── package.json

注意点

  • ユーザー情報を取得するにはsetSessionとonAuthStateChangeとなるが、こちらもサーバー側でしかsupabaseがimportできないのでapiから呼ぶ必要がある。
  • コンポーネントからfetchで呼ぶのでonAuthStateChangedはpromiseを作成する必要がある。どちらも速度的には変わらない。
  • ユーザー情報だけならミドルウェアとcookiesでastro側で処理した方が良いかもしれないが、localsで管理するのはどうなのかと感じるのでプロジェクトによる。
  • formのactionなどの属性はSSRでないとデプロイ時に消えてしまうので注意が必要。
  • 属性を取得する場合でもノードの存在確認をしてから取得しないとデプロイ時にエラーとなる。
  • ミドルウェアはSSGだと機能しないので、コードフェンス内での処理にも注意。
  • ヘッダーナビなどミドルウェアで認証状態で分岐させる場合、SSG用に作成したページでもSSRにしないと動かないので注意が必要。別途fetchする。
  • 開発モードだとコンポーネント別にSSG/SSRが効いてしまうが、ビルド/デプロイ後はpages以下のファイルに統合されるので注意。
  • SSGのコードフェンス内で外部APIは呼べるが/api/はSSRでないと出来ない。
  • UIフレームワークでslotを使用する場合、フラグメントを使わないと配置が変わる。
  • OAuth認証でのredirectToとSite URLの連携に注意
  • ルートにcallbackは機能するが、/auth/callbackなどにするとcookieが消える
  • Astro.reqestでhashが取得できないなどルートで受け取らないと少し難解になる

結論

  • 注意点でも挙げている通り、開発モードでは動作するがデプロイすると動かない事が多々ある。原因としてはastroのトランスパイルによってastroファイルのコードが消失する場合がある。特にformの属性が消える事が公式にも書いてあった。
  • 基本的にアプリケーション開発するのであればSSRもしくはUIフレームワークを使用したほうが問題は起き難い。
  • デプロイに関してはアダプターをインストールすれば滞りなく進行する。env設定もすればsupabaseも問題なく連携できる。
  • ミドルウェアでグローバルステートとして認証管理をする場合、astroからUIフレームワークへのpropsがコード内に見える。
  • UIフレームワークでstoreやライブラリに入れても更新すると値が初期化されるので、結局ローカルストレージやindexDBが選択肢となる。どちらにしても値は見える。
  • svelteのstoreとnanostoresは殆ど同じであるので、svelteだけなら入れる必要はない。他のUIフレームワークも使用するなら入れるという形になる。
  • 認証からDBまでの大枠のアプリの形は整ったので、後は内部で個別のアプリを作って入れていく事になる。

astroの動作検証はコチラ astroの認証はコチラ

Top categories

Loading Svelte Themes