📘

nuxt-authをセットアップして、GitHubログインを試す。

2023/09/26に公開

Nuxtをセットアップして動作確認

terminal
#node@ltsのセットアップ
volta install node@lts 

#nodeバージョン固定
volta pin node@lts 

#Nuxtの初期セットアップ
npx nuxi create-app nuxt-auth-tutorial 

#ディレクトリの移動
cd nuxt-auth-tutorial 

#初動確認
npm run dev -- -o 

nuxt-authのセットアップ

terminal
# nuxt-authライブラリインストール
npm i -D @sidebase/nuxt-auth 

config.tsにmodulesを追記

nuxt.config.ts
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  devtools: { enabled: true },
  modules: ['@sidebase/nuxt-auth'] //追記
})

GitHub認証機能の実装

ルートディレクトリに以下のファイルを追加する
server/api/auth/[...].ts

ファイルにコードを記述する

[...].ts
import { NuxtAuthHandler } from '#auth'
import GithubProvider from 'next-auth/providers/github'

export default NuxtAuthHandler({
    providers: [
        // @ts-expect-error You need to use .default here for it to work during SSR. May be fixed via Vite at some point
        GithubProvider.default({
           clientId: 'enter-your-client-id-here',
           clientSecret: 'enter-your-client-secret-here'
        })
    ]
})

GitHub Providerのドキュメント確認

https://next-auth.js.org/providers/github

Configurationセットアップ

https://github.com/settings/apps

設定内容

.evnの作成

ルートディレクトリに .env ファイルを作成して、下記を記述する

.env
GH_CLIENT_ID='****'
GH_SECRET='****'

.envを読み込む設定を追加

[...].ts
import { NuxtAuthHandler } from '#auth'
import GithubProvider from 'next-auth/providers/github'

export default NuxtAuthHandler({
  providers: [
    // @ts-expect-error You need to use .default here for it to work during SSR. May be fixed via Vite at some point
    GithubProvider.default({
      clientId: process.env.GH_CLIENT_ID,
      clientSecret: process.env.GH_SECRET
    })
  ]
})

認証画面を作成してサインイン/サインアウトを試す

ルートディレクトリに pages/index.vue を作成してコードを記述する

pages/index.vue
<template>
  <div>
    <button v-if="loggedIn" @click="handleSignOut">SiginOut</button>
    <button v-else @click="handleSignIn">SiginIn</button>
  </div>
</template>
<script setup lang="ts">
const { status, data, signIn, signOut } = useAuth();

const loggedIn = computed(() => status.value === "authenticated");

async function handleSignIn() {
  await signIn("github");
}

async function handleSignOut() {
  await signOut();
}
</script>

app.vue から先程の pages/index.vue を読み込むコードを記述する

app.vue
<template>
  <div>
    <NuxtPage />
  </div>
</template>
terminal
npm run dev -- -o

GitHub認証に成功するとボタンが SignOut に変わる

ブラウザのクッキーにセッショントークンが保持されていることを確認できる。

参考情報

https://www.youtube.com/watch?v=x6xTw7ZZxIw&list=PLQdX2Upwv8S6C7C75dysmBzWa0Nwnjm4W

以上。

Discussion