概要
Nuxt3 と Supabase を使って Google ログインの機能を作り、Vercel にデプロイする手順を記載する。
リポジトリはこちらを参照。
本記事では、以下の手順を一部参考に実施している。
環境
- Nuxt: 3.13.2
Nuxt3 のプロジェクトを作成
はじめに、Nux3 のプロジェクトを作成する
npx nuxi@latest init supabase-google-login-app
プロジェクトのディレクトリに移動し、アプリケーションが起動することを確認する
cd supabase-google-login-app
npm run dev
以下の URL にアクセスし、Nuxt3 の初期の画面が表示されれば成功。
Supabase の設定
Googleログインの際の認証に利用する、Supabaseの設定を行う。事前準備としてSupabaseのアカウントを作成しておく。
Supabase のプロジェクト作成
Supabase のダッシュボードにアクセスする。画面上部の「New Project」よりプロジェクトを作成する
設定画面が表示される為「Project Name」「Database Password」「Region」を入力する。
入力完了後「Create new project」をクリックすると、 Supabase のプロジェクトが新規に作成される。
作成後、ダッシュボードに表示される「Project URL」「API Key」を.env
ファイルに記載する。また、Google 認証後にリダイレクトする先の URL もREDIRECT_HOST
に設定しておく。
SUPABASE_URL=${コピーしたProject URL}
SUPABASE_ANON_KEY=${コピーしたAPI Key}
REDIRECT_HOST=http://localhost:3000
@nuxtjs/supabase
をプロジェクトに追加
Supabase を利用するためのモジュールをプロジェクトに追加する。
npx nuxi@latest module add supabase
nuxt.config.js
に以下の設定を追加する
export default defineNuxtConfig({
modules: ["@nuxtjs/supabase"],
supabase: {
key: process.env.SUPABASE_ANON_KEY, // Supabase の API Keyの設定
},
runtimeConfig: {
public: {
redirectHost: process.env.REDIRECT_HOST, // リダイレクト先の ホスト名の設定
},
},
});
公式の手順ではSUPABASE_ANON_KEY
の代わりにSUPABASE_KEY
を利用している。
しかしSUPABASE_KEY
は 、Vercel と Supabase の連携の際に、自動で環境変数が連携されない。
そのため、本手順では自動で連携されるSUPABASE_ANON_KEY
を利用し、nuxt.config.ts
でSUPABASE_ANON_KEY
を読み込むようにしている。
Google ログインの設定
事前準備として、Google Cloud Platform にアクセスし、プロジェクトを作成する
Google 認証の Auth 同意画面を作成
検索バーに「OAuth 同意画面」と入力し、OAuth 同意画面を作成のコンソールに移動する。「User Type」は「外部」を選択し「作成」をクリックする。
その後「アプリ名」「サポートメール」「デベロッパー連絡先情報」を入力する。
それ以外の設定値はデフォルトのまま「保存して続行」をクリックする。
以下の画面が表示されれば成功。
Callback URL を Supabase から取得
Supabase のダッシュボードにアクセスし「Authentication > Providers」の画面に移動する。
画像赤枠の「Callback URL(for OAuth)」の値をコピーする。
認証情報を作成
「認証情報 > 認証情報を作成 > OAuth クライアント ID の作成」より新規に認証情報を作成する
各種パラメータに以下の値を入力する。
- アプリケーションの種類: ウェブアプリケーション
- アプリケーション名: 任意の名前(今回は
supabase-google-login-app
) - 承認済みの JavaScript 生成元: localhost:3000
- 許可されたリダイレクト URI: Supabase から取得した Callback URL
入力後、「作成」をクリックすると「クライアント ID」と「クライアントシークレット」が生成される。
「クライアント ID」と「クライアントシークレット」は後の手順で利用するため控えておく。
Supabase で Provider を設定
Supabase の画面に戻り「Authentication > Providers」の画面に再度移動する。
Google の Provider を設定し、各種パラメータに以下の値を入力する。
- Client ID (for OAuth): 先ほど作成した OAuth クライアント ID
- Client Secret (for OAuth): 先ほど作成した OAuth クライアント ID のシークレット
以上の手順でGoogleログインに必要なGCPとSupabaseの設定は完了となる。次の手順からNuxtのアプリ側の設定を行う。
Nuxt3 でログイン機能を実装
ログインの画面とリダイレクトの画面、ログイン後に表示される画面を実装する
<template>
<div>
<NuxtPage />
</div>
</template>
<script setup lang="ts">
const supabase = useSupabaseClient();
const runtimeConfig = useRuntimeConfig();
const signInWithGoogle = async () => {
const { error } = await supabase.auth.signInWithOAuth({
provider: "google",
options: {
redirectTo: `${runtimeConfig.public.redirectHost}/confirm`,
},
});
if (error) console.log(error);
};
</script>
<template>
<div>
<button @click="signInWithGoogle">Sign In with Google</button>
</div>
</template>
<script setup lang="ts">
const user = useSupabaseUser();
watch(
user,
() => {
if (user.value) {
return navigateTo("/");
}
},
{ immediate: true }
);
</script>
<template>
<div>Waiting for login...</div>
</template>
ログイン後のトップページを作成する。ログインしたユーザのメールアドレスが表示されるようにし、ログインしていない状態でアクセスした場合は/login
画面に強制的にリダイレクトするようにする。
<script setup lang="ts">
const client = useSupabaseClient();
const userEmail = ref("");
onMounted(async () => {
const user = await client.auth.getUser();
// 認証されていない時、ログインページにリダイレクト
if (!user) {
client.auth.signOut();
window.location.href = "/login";
}
// 認証されている場合はユーザー情報を取得
userEmail.value = user.data.user?.email!; // ユーザーのメールアドレスを取得
});
</script>
<template>
<div>
<p>Hello! {{ userEmail }}</p>
</div>
</template>
動作確認
localhost:3000/login
にアクセスし、「Sign In with Google」をクリックする
Google のログイン完了後、localhost:3000
にリダイレクトされ、「Hello!」の後にログインしたユーザのメールアドレスが表示されていれば成功
Vercel にデプロイ
事前準備として、Vercelのアカウントの作成と、Github に Public リポジトリを作成し、本プロジェクトをPushしておく。
Vercel の無料プランでは、プライベートリポジトリのデプロイができない。
Vercel のアカウントで無料プランを利用している場合は、Github の リポジトリを Public に設定する必要がある
Vercel にプロジェクトを作成
ダッシュボードの「New Project」よりプロジェクトを新規作成する
「Import Git Repository」で、先ほど Github に Push したリポジトリを選択し、「Import」をクリックする
「Project Name」に任意の名前を入力し、「Deploy」をクリックする
しばらくするとデプロイが完了するが、この状態では Supabase の設定が反映されていないため、500 エラーとなる。
以降の手順でVercelの設定を行う
Vercel と Supabase の環境変数を設定
Vercel の Project の「Settings > Integrations」の画面に遷移する
Supabase を選択し「Configure」をクリックする。
該当するプロジェクトが含まれる「組織」か「プロジェクト」を選択する。
画面赤枠の「Add new project connection」をクリック
Supabase のプロジェクトと、先ほど作成した Vercel のプロジェクトを選択し「Connect project」をクリックする
連携が成功したら、Vercel のプロジェクトに環境変数が自動で設定される。
Supabase に Vercel の URL をリダイレクト先として許可
「Environment Variables」の画面で環境変数を設定する。
ここではリダイレクト先であるREDIRECT_HOST
を設定する。今回の場合 Vercel の URL(https://nuxt-supbase-google-login-app.vercel.app
)を設定する。
Supabase のダッシュボードにアクセスし、「Authentication > URL Configuration」の画面に移動する。「Redirects URL」よりデプロイした Vercel の URL を追加する。
今回であれば以下の 2 つの URL を追加する。
https://nuxt-supbase-google-login-app.vercel.app
https://nuxt-supbase-google-login-app.vercel.app/**
この設定をしない場合、Google のログイン後にリダイレクトができず、localhost:3000
にリダイレクトされてしまうため、設定の必要がある。