Remix × Vercel × SupabaseでGoogleログインを実装する手順
Remix × Vercel × SupabaseでGoogleログインを実装する手順
RemixとSupabaseでGoogle認証を実装する際、特にリダイレクトURLの設定で躓くことが多いのではないでしょうか。この記事では、実際の開発で遭遇したエラーと解決方法を交えながら、確実に動作する設定手順を解説します。
全体の流れ
認証の仕組みを理解すると設定がスムーズになります。
この流れを踏まえて設定していきましょう。
1. Supabaseプロジェクトの準備
プロジェクト作成
Supabaseで新規プロジェクトを作成します。無料プランでは2つまでしかプロジェクトが作れないので、開発用と本番用を分けている場合は注意が必要です。
Google認証の有効化
- Supabaseダッシュボードの「Authentication」→「Providers」
- 「Google」を選択
- 「Enable sign in with Google」をオンにする
- Client IDとClient Secret欄は後で埋めます
2. Google Cloud Consoleの設定
プロジェクト作成
Google Cloud Consoleで新しいプロジェクトを作成します。
OAuth同意画面の設定
- 「OAuth同意画面」で基本情報を入力
- スコープは最低限のものを選択
- テストユーザーを追加(本番公開前は必要)
OAuthクライアントIDの作成
- 「認証情報」→「認証情報を作成」→「OAuthクライアントID」
- アプリケーションの種類:「ウェブアプリケーション」
- 重要:承認済みのリダイレクトURI
ここが一番間違いやすいポイントです。
https://[your-supabase-project-ref].supabase.co/auth/v1/callback
このURLはSupabaseのプロジェクト設定で確認できます。/auth/v1/callback
の部分は必須です。
アプリのURL(https://your-app.vercel.app/
など)はここには入れません。
3. Supabaseの認証設定
作成したGoogle OAuthのClient IDとClient SecretをSupabaseに設定します。
Redirect URLsの設定
ここがもう一つの重要なポイントです。「Authentication」→「Settings」で以下を設定:
Site URL(デフォルトリダイレクト先)
https://your-app.vercel.app/
メインの本番環境URLを設定します。
Redirect URLs(許可するリダイレクト先一覧)
http://localhost:5173/
https://your-app.vercel.app/
https://your-app.com/
開発環境、本番環境、将来使う予定のドメインなど、認証後にリダイレクトさせたいURLをすべて登録します。
※ http://localhost:5173/
はRemixのVite開発サーバーのデフォルトURLです。もし異なるポートを使用している場合は、そのポートに変更してください。
ワイルドカード(https://*.your-app.com
)も使えます。
4. Remixアプリの実装
環境変数の設定
SUPABASE_URL=https://your-project-ref.supabase.co
SUPABASE_ANON_KEY=your-anon-key
Supabaseクライアントの作成
// app/lib/supabase.ts
import { createClient } from '@supabase/supabase-js'
export const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_ANON_KEY!
)
ログイン実装
// app/routes/login.tsx
import { supabase } from '~/lib/supabase'
export default function Login() {
const handleGoogleLogin = async () => {
const { error } = await supabase.auth.signInWithOAuth({
provider: 'google',
options: {
redirectTo: `${window.location.origin}/dashboard`
}
})
if (error) {
console.error('Login error:', error)
}
}
return (
<button onClick={handleGoogleLogin}>
Googleでログイン
</button>
)
}
セッション管理
// app/hooks/useAuth.ts
import { useEffect, useState } from 'react'
import { supabase } from '~/lib/supabase'
import type { Session } from '@supabase/supabase-js'
export function useAuth() {
const [session, setSession] = useState<Session | null>(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
// 現在のセッションを取得
supabase.auth.getSession().then(({ data: { session } }) => {
setSession(session)
setLoading(false)
})
// セッション変更を監視
const { data: { subscription } } = supabase.auth.onAuthStateChange(
(_event, session) => {
setSession(session)
setLoading(false)
}
)
return () => subscription.unsubscribe()
}, [])
return { session, loading }
}
5. Vercelでの本番運用
環境変数の設定
Vercelのダッシュボードで以下の環境変数を設定:
SUPABASE_URL
SUPABASE_ANON_KEY
ドメイン追加時の注意点
新しいドメインを追加する場合は、Supabaseの「Redirect URLs」に忘れずに追加してください。
よくあるエラーと対処法
"redirect_uri_mismatch"エラー
Google Cloud ConsoleのリダイレクトURIが正しく設定されていない可能性があります。Supabaseのコールバック用URLが正確に入力されているか確認してください。
"Invalid redirect URL"エラー
SupabaseのRedirect URLsに、認証後にリダイレクトしようとしているURLが登録されていません。
ローカル開発で認証が失敗する
http://localhost:5173/
(RemixのVite開発サーバーのデフォルトURL)がSupabaseのRedirect URLsに追加されているか確認してください。異なるポートを使用している場合は、そのポートのURLを登録してください。
まとめ
認証設定で大切なのは、以下の2つのリダイレクト先を正しく理解することです:
- GoogleからSupabaseへ:Google Cloud ConsoleのOAuth設定
- Supabaseからアプリへ:SupabaseのRedirect URLs設定
最初は混乱しやすいですが、一度理解すれば応用が利きます。他の認証プロバイダー(GitHub、Discord等)でも基本的な考え方は同じです。
認証周りは細かい設定が多くて大変ですが、ユーザー体験の根幹部分なので丁寧に実装していきましょう。
設定が完了すれば、ユーザーはワンクリックでスムーズにログインできるようになります。快適な開発体験を!
この記事について
フロントエンドエンジニアとして日々開発している中で、認証設定でハマった経験をもとに執筆しました。同じように困っている方の参考になれば幸いです。
質問や改善点があれば、お気軽にコメントやフィードバックをいただけると嬉しいです。
Discussion