Next.jsにAuth0でログイン機能を実装
この記事ではAuth0を使用してNext.jsアプリにログイン機能を実装します。
今回作成するソースを先に載せておきます。
GitHub
Auth0とは
Auth0とはWEBアプリ・モバイルアプリ・API等に認証・認可機能を提供してくれるクラウドサービスです。
いわゆるIDaasと言われるサービスです。
IDaaSとはIdentity as a Serviceの略称で、アイデンティティ(Identity)の管理をSaaSやIaaSなどと同じくクラウドにて管理するサービスです。
前提条件
Auth0のアカウントを作成してください。
⇢Auth0公式
Next.js環境構築
まずは簡単にNext.jsアプリの環境を構築します。
Next.jsの構築方法はこちらを参考にしてみてください。
⇢Dockerで、Next.js,TypeScript環境構築方法
プロジェクト名はnext-auth0
で作成しました。
Auth0
Next.jsアプリの作成ができたら、Auth0のテナントドメインを作成します。
右上のCreateApplication
を押下しましょう。
次にName
に任意の名前を入力して、Single Page Web Applications
を選択します。
そうしたら、右下のCreate
ボタンを押下しましょう。
これでテナントドメインの作成が完了です。
次に作成したテナントドメインにアクセス許可をつけましょう。
setting
タブを押下します。
Allowed Callback URLs
,Allowed Logout URLs
,Allowed Web Origins
にURLを入力しましょう。
``
Allowed Callback URLs
はユーザーが認証後に遷移するURLを入力します。
Allowed Logout URLs
はユーザーがログアウト後に遷移するURLを入力します。
'Allowed Web Origins'はAuth0にアクセスを許可するURLを入力します。
ここまで入力できたら、一番したのSave Changes
を押下しましょう。
認証機能実装
ここまでできたら、Next.js側で認証機能の実装をしていきます。
まずは@auth0/auth0-react
を入力してインストールします。
npm install @auth0/auth0-react
npm WARN saveError ENOENT: no such file or directory, open '/usr/src/app/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/usr/src/app/package.json'
その場合、--prefix ディレクトリ名
を入力して、インストールします。
docker-compose run app npm --prefix ./ディレクトリ名 install @auth0/auth0-react
Auth0と連携するための設定
Auth0と連携するための設定を行います。
pages
ディレクトリ内にある_app.tsx
ファイルを下記のように編集します。
import '../styles/globals.css'
import type { AppProps } from 'next/app'
import { Auth0Provider } from '@auth0/auth0-react'
function MyApp({ Component, pageProps }: AppProps) {
return (
<Auth0Provider
domain=Auth0で作成したドメイン
clientId=Auth0で作成されたClientID
redirectUri="http://localhost:3000/"
>
<Component {...pageProps} />
</Auth0Provider>
)
}
export default MyApp
ログイン機能実装
ログイン機能を実装します。
pages
等があるデイレクトリにcomponents
フォルダを作成しましょう。
mkdir components
作成したcomponents
フォルダ内にlogin.tsx
ファイルを作成しましょう。
cd components
touch login.tsx
login.tsx
を編集しましょう。
import React from "react";
import { useAuth0 } from "@auth0/auth0-react";
const LoginButton = () => {
const { isAuthenticated, loginWithRedirect } = useAuth0();
return isAuthenticated ? null : (
<button onClick={() => loginWithRedirect()}>Log In</button>);
};
export default LoginButton;
ログアウト機能実装
次にログアウトもできるようにしましょう。
components
ディレクトリ内にlogout.tsx
ファイルを作成しましょう。
touch logout.tsx
logout.tsx
も編集しましょう。
mport React from "react";
import { useAuth0 } from "@auth0/auth0-react";
const LogoutButton = () => {
const { user, isAuthenticated, logout } = useAuth0();
return isAuthenticated ?(
<div>
<p>ログイン完了</p>
<p>{user?.email}</p>
<button onClick={() => logout({ returnTo: window.location.origin })}>
Log Out
</button>
</div>
) : null;
};
export default LogoutButton;
最後にindex.tsx
に作成したlogin.tsx
とlogout.tsx
をimport
して使用しましょう。
import type { NextPage } from 'next'
import Head from 'next/head'
import styles from '../styles/Home.module.css'
import LoginButton from '../components/login'
import LogoutButton from '../components/logout'
const Home: NextPage = () => {
return (
<div className={styles.container}>
<Head>
<title>Create Next App</title>
<meta name="description" content="Generated by create next app" />
<link rel="icon" href="/favicon.ico" />
</Head>
<main className={styles.main}>
<h1 className={styles.title}>
Welcome to <a href="https://nextjs.org">Next.js!</a>
</h1>
<LoginButton/>
<LogoutButton/>
</main>
</div>
)
}
export default Home
以上で実装が完了です。
実際にできているかhttp://localhost:3000/
にアクセスして確認してみましょう!
Log In
ボタンを押してみると、ログイン画面が表示されました!
Sign up
から新たにe-mail
とPASSWORD
を作成して、ログインをして見るとLog Out
ボタンとログイン完了
の文字が表示されていると思います!!
Log Out
ボタンを押すとLog In
ボタンが表示されます!
これで認証機能の実装は完了です!!
やり方を覚えてしまえば簡単にできますね。
認証機能が楽にできてしまえば、コア機能に集中できて良いですね!
終わり
最後まで見てくださりありがとうございました!!
これからもブログの更新を頑張っていきますので、是非フォローしてください!
色々な人と繋がって輪を広げていきたいです!!
ツイッターもやっているのでぜひフォローもお願いします!
Twitter
Discussion