Next.jsにauth0を導入する方法(app router対応版)
Next.jsにauth0を導入する方法について
環境紹介
node v20.14.0 (npm v10.7.0)
Next.jsをインストール
Next.js version 13で導入されたapp router対応。
npx create-next-app@latest
参考URL
Installation
create-next-app@14.2.3
Ok to proceed? (y) y
✔ What is your project named? … hoge
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias (@/*)? … No / Yes
Creating a new Next.js app in /Users/maito/bitbucket/hoge/hoge.
Using npm.
Initializing project with template: app-tw
Installing dependencies:
- react
- react-dom
- next
Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- postcss
- tailwindcss
- eslint
- eslint-config-next
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
added 358 packages, and audited 359 packages in 39s
133 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
Success! Created onechan at /Users/maito/bitbucket/hoge/hoge
Auth0のアカウント作成
ログイン画面から、アカウントの作成をしました。
googleのアカウントを持っていたので、「googleで続ける」を選択しました。
Auth0の利用規約の同意
利用規約を求められたのでチェックを入れて「Next」ボタンをクリックしました。
アカウント作成完了
tenantを日本に変更
tenantがデフォルトでアメリカになっているので、日本に変更します。
下記画像で、「Create Tenant」をクリック。
無料プランの場合、productionモードしか選べないので、productionモードを選択して、ドメイン名を入力して、「Create」 ボタンをクリックします。
日本用のtenantができました。
auth0の設定
- 左側の初心者を選択。
- Regular Web AppのNext.jsを選択
ってか、Next.jsってRegular Web Appかなー?
- ログインさせたいサービスを選択。
今回は、メアドだけのログインを作りたかったので、デフォルトで選択されたgoogleログインのチェックをはずす。
これ、運用開始したら、途中で、増やせますよね?
- 「Try Login」ボタンをクリックして、右下にある「continue」をアクティブにする。
- 「DOWNLOAD SAMPLE APP」 をクリックして、右下にある「I Am Ready To Use Auth0」ボタンをアクティブにする。
- 完了
auth0のコールバックURLを設定。
- Allowed Callback URLsにhttp://localhost:3000/api/auth/callbackを入力
- Allowed Logout URLsにhttp://localhost:3000を入力
して保存。
Nextjs用のauth0ライブラリをインストール
- npm installでNextjs用のauth0ライブラリをインストール
npm install @auth0/nextjs-auth0
- インストール結果
added 18 packages, and audited 377 packages in 2s
137 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
.env.localファイルの作成
Next.jsのトップディレクトリに.env.localを作成して、Client ID、Client Secretを入力。
# A long, secret value used to encrypt the session cookie
AUTH0_SECRET='LONG_RANDOM_VALUE'
# The base url of your application
AUTH0_BASE_URL='http://localhost:3000'
# The url of your Auth0 tenant domain
AUTH0_ISSUER_BASE_URL='https://YOUR_AUTH0_DOMAIN.auth0.com'
# Your Auth0 application's Client ID
AUTH0_CLIENT_ID='YOUR_AUTH0_CLIENT_ID'
# Your Auth0 application's Client Secret
AUTH0_CLIENT_SECRET='YOUR_AUTH0_CLIENT_SECRET'
- Client IDとClient Secretは、ApplicationsのSettingで確認(下図参照)。
- AUTH0_SECRETは、下記コマンドで取得
node -e "console.log(crypto.randomBytes(32).toString('hex'))"
login、logoutを実装
- app/api/auth/[auth0] のディレクトリを作成
- route.tsを作成 (マニュアルではroute.jsでした)
- route.tsに下記コードを追加
import { handleAuth } from '@auth0/nextjs-auth0';
export const GET = handleAuth();
- layout.tsxにUserProviderを追加
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import { UserProvider } from '@auth0/nextjs-auth0/client';
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<UserProvider>
<html lang="en">
<body className={inter.className}>{children}</body>
</html>
</UserProvider>
);
}
- page.tsxを下記に変更
'use client';
import { useUser } from '@auth0/nextjs-auth0/client';
export default function Home() {
const { user, error, isLoading } = useUser();
if (isLoading) return <div>Loading...</div>;
if (error) return <div>{error.message}</div>;
if (user) {
return (
<div>
Welcome {user.name}! <a href="/api/auth/logout">Logout</a>
</div>
);
}
return <a href="/api/auth/login">Login</a>;
}
参考URL
nextjs-auth0
動作確認
- Next.jsを起動
npm run dev
実行結果
- 「ログイン」をクリック後
- 新規会員登録完了後
感想
-
少しだけ、HTMLを修正しただけなのに、TVの砂嵐画面のようになったのはなぜ?
-
Warning: Extra attributes from the server: data-google-analytics-opt-out という、auth0とは全く関係ないエラーでて気が散るからどうにかしてほしい。(app router前は、こんなエラーなかった。)
-
auth0側の文言が英語だったので、日本語にならないかぁー。離脱率上がっちゃうよ。
Discussion