Next.jsで認証機能を実装するためのライブラリであるNextAuth.jsを使ってGoogleログイン機能を作成する方法を解説します。
環境
- next @13.2.1
- next-auth @4.19.2
- react 18.2.0
FirebaseでAPIキーの発行
GoogleのOAuthを利用するために、以下の手順でFirebaseで認証機能のAPIキーを発行します。
- Firebaseでプロジェクトを作成
- Authenticatorを開く
- Sign-in methodタブより、Googleを選択し、有効とする
- ウェブSDK構成を開き、「ウェブ クライアント ID」と「ウェブ クライアント シークレット」が生成されていることを確認する。
この2つのキーは後ほど使用します。
NextAuth.jsの導入
NextAuth.jsとは
NextAuth.jsは、Next.jsアプリケーションで認証機能を実装するためのJavaScriptライブラリです。OAuthをサポートしており、主要な認証プロバイダー(Google、Facebook、Twitter、GitHubなど)との統合も簡単に行うことができます。
公式ドキュメントはこちら
インストール
まずは、npmを使ってnextAuth.jsをインストールします。
npm install next-auth
設定
次に、nextAuth.jsの設定を行います。まず、pages/api/auth/[…nextauth].tsファイルを作成し以下のようなコードを書きます。
import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";
export const authOptions = {
// Configure one or more authentication providers
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_ID!,
clientSecret: process.env.GOOGLE_SECRET!,
}),
// ...add more providers here
],
};
export default NextAuth(authOptions);
ログイン画面の作成
次に、ログイン画面を作成します。components/Login.tsxに以下のようなコードを書きます。
"use client";
import { signIn } from "next-auth/react";
const Login = () => {
return (
<div>
<button onClick={() => signIn("google")}>
サインイン
</button>
</div>
);
};
export default Login;
認証済みユーザーの取得
最後に、認証済みユーザーの情報を取得する方法について説明します。
sessionを渡すためのSessionProviderというコンポーネントを作成します。
"use client";
import { Session } from "next-auth";
import { SessionProvider as Provider } from "next-auth/react";
type Props = {
children: React.ReactNode;
session: Session | null;
};
export const SessionProvider = ({ children, session }: Props) => {
return <Provider>{children}</Provider>;
};
sessionにより表示の切り替えをしたいコンポーネントをSessionProviderで囲みます。
import { getServerSession } from "next-auth";
import Login from "../components/Login";
import { SessionProvider } from "../components/SessionProvider";
import { authOptions } from "../pages/api/auth/[...nextauth]";
import "../styles/globals.css";
export default async function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
const session = await getServerSession(authOptions);
return (
<html>
<head />
<body>
<SessionProvider session={session}>
{!session ? (
<Login />
) : (
<div>Home</div>
)}
</SessionProvider>
</body>
</html>
);
}
これにより、sessionが無い場合は、先程作成したLoginコンポーネントを表示し、sessionがある場合は、Homeと表示されます。
ログアウト機能の作成
Sidebarというcomponentが作られている前提で、「ログアウト」ボタンを押したらログアウトの処理が行われるようにします。
"use client";
import { signOut, useSession } from "next-auth/react";
import NewChat from "./NewChat";
const SideBar = () => {
const { data: session } = useSession();
return (
<div className="p-2 flex flex-col h-screen">
{session && (
<button onClick={() => signOut()}>ログアウト</button>
)}
</div>
);
};
export default SideBar;
まとめ
NextAuthを使用することで、Googleのログイン機能を簡単に作ることができ、sessionを使ったアクセス制限の実装も簡単にできました。
以上、ご覧頂きありがとうございました。
コメント