🐧

NextAuth 使ってみた

2022/06/20に公開

初めてNextAuthを使って少し詰まったところもあったので自分用にメモ
今回はGoogle Providerを使用してます

目的

NextAuthを使ってGoogleアカウントでログインする

Next.jsの設定

Next.js TypeScriptのプロジェクトを作る

yarn create next-app --typescript

NextAuthをインストール

yarn add next-auth

pages/api/auth/[...nextauth].ts の作成

pages/api/auth/[...nextauth].ts
import NextAuth from 'next-auth';
import GoogleProvider from 'next-auth/providers/google';

export default NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID ?? '',
      clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? '',
    }),
  ],
  callbacks: {
    //jwtが作成・更新された時に呼ばれる
    async jwt({ token, account }) {
      if (account) {
        token.accessToken = account.access_token;
      }
      return token;
    },
    //セッションがチェックされた時に呼ばれる
    async session({ session, token, user }) {
      session.accessToken = token.accessToken;
      return session;
    },
  },
});
index.tsx
import type { NextPage } from 'next';
import { useSession, signIn, signOut } from 'next-auth/react';

const Home: NextPage = () => {
  const { data: session } = useSession();

  if (session && session.user) {
    return (
      <>
        Signed in as {session.user.email} <br />
        <button onClick={() => signOut()}>Sign out</button>
      </>
    );
  }
  return (
    <>
      Not signed in <br />
      <button onClick={() => signIn()}>Sign in</button>
    </>
  );
};

export default Home;
_app.tsx
import type { AppProps } from 'next/app';
import { SessionProvider } from 'next-auth/react';

function MyApp({ Component, pageProps: { session, ...pageProps } }: AppProps) {
  return (
    <SessionProvider session={session}>
      <Component {...pageProps} />
    </SessionProvider>
  );
}

export default MyApp;

プロジェクトと同じディレクトリに.env.localファイルを作成
ブラウザ側でも呼び出したいなら変数名の前にNEXT_PUBLIC_ が必要

.env.local
GOOGLE_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxx
GOOGLE_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxx

OAuthの設定

OAtuth同意画面の設定する
https://console.cloud.google.com/apis/credentials

下記がわかりやすい(補足としてGoogle WorkSpaceユーザーではない場合Use Typeは外部を選択)
https://support.google.com/workspacemigrate/answer/9222992?hl=ja

OAtuth同意画面の設定が終わったら認証情報に移動してOAuthクライアントIDを作成する

https://i.gyazo.com/9171ccbd5e9b9ee1ff5047259d8b7668.png

アプリケーションの種類はウェブアプリケーションを指定
リダイレクトURIにhttp://localhost:3000/api/auth/callback/googleを設定

https://i.gyazo.com/9dfe500df0cfcd0941e118ea567c4d5e.png

作成するとクライアントIDとクライアントシークレットが表示されるのでコピーして
Next.js側で作成した.env.localに貼り付ける

.env.local
GOOGLE_CLIENT_ID=コピーしたクライアントID
GOOGLE_CLIENT_SECRET=コピーしたクライアントシークレット

yarn devでサーバ起動

ログイン前

Image from Gyazo

ボタンを押した後

https://i.gyazo.com/87a43acd1ae775bd003a35a5182bbf24.png

ログイン後

https://i.gyazo.com/ba55f4454212845b0f117501888894c4.png

ちみなにsignInの引数にプロバイダーを指定するとボタンを押した後の画面を
スキップできるようです

index.tsx
import type { NextPage } from 'next';
import { useSession, signIn, signOut } from 'next-auth/react';

const Home: NextPage = () => {
  const { data: session } = useSession();

  if (session && session.user) {
    return (
      <>
        Signed in as {session.user.email} <br />
        <button onClick={() => signOut()}>Sign out</button>
      </>
    );
  }
  return (
    <>
      Not signed in <br />
      {/* 変更 */}
      <button onClick={() => signIn('google')}>Sign in</button>
    </>
  );
};

export default Home;

所感

メール認証使用しないならfirebase authよりもこっちを使ったほうが楽かも
大体のことは公式ドキュメント読めば解決しそう
https://next-auth.js.org/

今回のサンプルプロジェクト
https://github.com/happy663/next-auth-sample

GitHubで編集を提案

Discussion