NextAuth×サーバーレスRedisで実現するNext.js認証の実装ガイド
Next.jsは、Reactをベースとした最も人気のあるフロントエンドフレームワークの一つです。静的なHTMLを生成できるだけでなく、クライアント側・サーバー側のどちらでも動的にレンダリングでき、この柔軟性によりあらゆる種類のアプリケーションやWebサイトに対応できる万能なツールとなっています。しかもオープンソースで、無料で利用できる点も大きな魅力です。
NextAuthは、Next.js向けのサードパーティライブラリで、さまざまなIDプロバイダーやデータベースとの統合を簡単に実現できます。ユーザーのサインアップの手間を省きながら、必要なアカウント情報を選択したデータベースに保存できます。NextAuthはGitHub、Google、Facebook、Coinbaseなど、50以上の認証プロバイダーに対応しています。
NextAuth Upstash Redis アダプターとは
現在、Upstash RedisはNextAuthが公式にサポートするデータベースの一つです。
upstash-redis NextAuthアダプターはUpstashのHTTPクライアントを使用しており、多くのホスティングサービス上で動作します。さらに、プレフィックス(接頭辞)を活用すれば、1つの無料枠のRedisデータベースを、NextAuth対応の複数アプリケーションで共有することも可能です。
それでは、この新しくリリースされたアダプターを使って、NextAuthを実際に試してみましょう。
Upstash Redisを使ったNextAuthの実装例
このチュートリアルでは、Node.js 16.13.2以降がインストールされている必要があります。また、GitHubアカウントとUpstashアカウントも事前に用意しておいてください。
アプリケーションのセットアップ
まず、基本的なNext.jsアプリを作成します。この例ではlearn-starterテンプレートで十分です。
以下のコマンドを使用します。
$ npx create-next-app nextauth-upstash-redis \
--use-npm \
--example "https://github.com/vercel/next-learn/tree/master/basics/learn-starter"
認証情報の設定を簡単にするため、dotenvパッケージも併用します。dotenv、NextAuth、Redisアダプター、Upstash HTTP Redisクライアントをまとめてインストールするには、次のコマンドを実行します。
$ npm i dotenv next-auth @upstash/redis @next-auth/upstash-redis-adapter
認証APIエンドポイントの作成
NextAuth用のAPIエンドポイントはシンプルなJSファイルです。pages/api/auth/[...nextauth].jsを作成し、以下の内容を記述します。
import NextAuth from "next-auth";
import GithubProvider from "next-auth/providers/github";
import { UpstashRedisAdapter } from "@next-auth/upstash-redis-adapter";
import { Redis } from "@upstash/redis";
import "dotenv/config";
export default NextAuth({
adapter: UpstashRedisAdapter(
new Redis({
url: process.env.UPSTASH_REDIS_URL,
token: process.env.UPSTASH_REDIS_TOKEN,
})
),
providers: [
GithubProvider({
clientId: process.env.GITHUB_ID,
clientSecret: process.env.GITHUB_SECRET,
}),
],
});
UpstashRedisAdapterはupstashRedisClientをラップしたもので、環境変数から取得したUpstashの認証情報を渡します。この例では、dotenvパッケージを使って、アプリケーションのルートディレクトリにある.envファイルから値を読み込んでいます。GitHubプロバイダーの認証情報も同様の扱いです。
環境変数の設定
環境変数を設定するには、以下の内容で.envファイルを作成します。
UPSTASH_REDIS_URL=
UPSTASH_REDIS_TOKEN=
GITHUB_ID=
GITHUB_SECRET=
Upstashの認証情報はUpstashコンソールから取得できます。コンソールにログインし、データベースを作成したら、概要画面でそのデータベースをクリックしてください。図1は、必要な認証情報が表示されるコンソール内の場所を示しています。
GitHubプロバイダーの認証情報は、GitHubアカウントに新しいOAuthアプリケーションを登録すると取得できます。図2は登録フォームの様子です。ローカルマシンでサンプルを実行する場合は、URLとしてhttps://localhost:3000を指定してください。

アプリを登録するとClient IDが表示され、「generate new client secret」ボタンをクリックするとシークレットを生成できます。
各サービスの設定が完了したら、次にNextAuthが取得したセッションデータをアプリのコンポーネントに渡せるようにしましょう。
そのためには、pages/_app.jsという新しいファイルを以下の内容で作成します。
import { SessionProvider } from "next-auth/react";
export default function App({
Component,
pageProps: { session, ...pageProps },
}) {
return (
<SessionProvider session={session}>
<Component {...pageProps} />
</SessionProvider>
);
}
このコードにより、Next.jsアプリ内のすべてのコンポーネントでセッションデータが利用可能になり、現在のユーザーがログイン済みかどうかを判定できるようになります。
動作確認のため、pages/index.jsも以下のコードで更新しましょう。
import { useSession, signIn, signOut } from "next-auth/react";
export default function Home() {
const { data: session } = useSession();
if (session) {
const { email, image, name } = session.user;
return (
<>
<img src={image} width="150" /> <br />
Signed in as {name} ({email}) <br />
<button onClick={signOut}>Sign out</button>
</>
);
}
return <button onClick={signIn}>Sign in</button>;
}
セッションが存在する場合は、現在のユーザーのプロフィール画像・名前・メールアドレスが表示されます。存在しない場合はサインインボタンのみが表示され、クリックすると自動的にログインページへリダイレクトされます。
アプリケーションのテスト
セットアップ全体をテストするには、次のコマンドを実行します。
$ npm run dev
このコマンドによりポート3000でHTTPサーバーが起動するので、ブラウザで開いてください。正常に動作していればサインインボタンが表示されるので、ボタンをクリックし、アプリがGitHubアカウントへ接続することを許可します。
サインアップが成功すると、インデックスページにリダイレクトされ、GitHubアカウントの情報が表示されるはずです。
1つのRedisデータベースを複数アプリケーションで共有する
Upstashでは、アカウントごとに1つの無料Redisデータベースが提供されています。このデータベースは、書き込まれるすべてのキーに付与されるプレフィックスを指定すれば、互いに独立した複数のアプリケーションで利用できます。
設定するには、pages/api/auth/[...nextauth].js内のコードを変更します。アダプターのファクトリー関数は、Upstash Redisクライアントに加えて第2引数を受け取ります。
UpstashRedisAdapter(
new Redis({
url: process.env.UPSTASH_REDIS_URL,
token: process.env.UPSTASH_REDIS_TOKEN,
}),
{ baseKeyPrefix: "app-specific-prefix-1:" }
);
これにより、複数アプリのユーザーデータがデータベース内で衝突する心配がなくなります。
まとめ
NextAuthは、面倒な作業なしにアプリケーションへ認証機能を組み込める非常に便利なライブラリです。そしてUpstash Redisも同様に扱いやすく、シンプルなRedisデータベースホスティングサービスです。新しく登場したNextAuth用Upstash Redisアダプターによって、この2つは強力な相乗効果を発揮し、短時間で新しいアプリケーションを開発できるようになります。
Upstash Redisはサーバーレスデータベースなので、利用した分だけの支払いで済みます。そのため、まだユーザーのいないアプリに高額な請求が来ることを心配せずに、複数のMVPをテストしながら素早く反復改善できます。
-
Flutter、Serverless Framework、Upstash(Redis)で構築するフルスタックサーバーレスアプリ 第2部
チュートリアルシリーズ第2部へようこそ。第1部では、UpstashとServerless Framework、Redisを使ってREST APIを構築する方法を解説しました。 この第2部では、そのREST APIのエンドポイントを利用するモバイルアプリケーションをFlutterで構築していきます。 それでは始めましょう 🙃 事前準備 まず、お使いのコンピュータにFlutterがインストールされ、正常に動作している必要があります。 Flutter IDEで新しいFlutterプロジェクトを作成し、任意の名前を付けてください。 依存パッケージの追加 プロジェクトのルートディレクトリにあるpu
-
Flutter、サーバーレスフレームワーク、Upstash(REDIS)を備えたフルスタックサーバーレスアプリ-パート1
この投稿では、データを保存するためのFlutter、Serverless Framework、Upstash、Redisを使用してサーバーレスモバイルアプリケーションを構築します。 Upstashとは? Upstashは、Redis用のサーバーレスデータベースです。 Upstashを使用すると、リクエストごとに支払います。これは、データベースが使用されていないときに課金されないことを意味します。 Upstashはデータベースを構成および管理します。これは、DynamoDBやFaunaなどの他のデータベースの強力な代替手段であり、などの利点があります。 低レイテンシ REDISAPIと同