Next.jsにSSRのセッション管理を行う
SPA(Single Page Application)
の場合はJWT
などのトークンを用いてのユーザー認証を行うことが多いですが、Next.js
などのSSR(Server Side Rendering)
の場合はセッションを使ってユーザー認証管理を行うことが一般的です。
next-auth
NextAuthライブラリは、Node.jsで最も一般的に使用される認証ライブラリであるExpress
とPassport
を使用して、電子メールやFacebook、Google、Twitterなどのサービスでのサインインをサポートする。
NextAuthは、クロスサイトリクエストフォージェリ(CSRF)トークン
とHTTP Only cookies
を追加し、ユニバーサルレンダリングをサポートし、クライアント側のJavaScriptを必要としません。
$ yarn add next-auth
NextAuth.jsのAPIルートを作成
以下のように/pages/api/auth/[...nextauth].ts
のページを作成する
重要な3つの設定ファイル
-
next-auth.config.js : セッションの保存時間、DBなどの設定
-
next-auth.functions.js : ログインの処理、セッションに保存するデータなど
-
next-auth.providers.js : Facebook、Twitter、GoogleなどのproviderのクライアントID,シークレットなどの情報を設定。利用しない場合は設定なしでOK。
nookies
Cookie を扱いやすくするためのライブラリとしてnookies
がある。
$ yarn add nookies
以下のようにauth.ts
というファイルを作成して、.tsx
から呼び出したりする。
import { setCookie, destroyCookie, parseCookies } from 'nookies'
import type { NextPage, NextPageContext } from 'next'
// cookieの削除
// ServerSide cookies
export const destroyCookieToken = (ctx: NextPageContext, token: string) => {
// console.log("token", token)
destroyCookie(ctx, 'accessToken')
}
// cookieにtokenをsetする
// ServerSide cookies
export const setCookieToken = (ctx: NextPageContext, token: string) => {
console.log("token", token)
setCookie(ctx, 'accessToken', token, {
maxAge: 30 * 24 * 60 * 60,
// path: '/',
})
}
// cookieを抽出する.
export const extractCookie = (ctx: NextPageContext) => {
const cookie = parseCookies(ctx)
return cookie
}
setCookieのOptions
setCookie(ctx, name, value, options)
かnookies.set(ctx, name, value, options)
を使用できる
setCookie(ctx, 'accessToken', token, {
maxAge: 30 * 24 * 60 * 60
})
上記のコードではmaxAge
だけを使用している
- domain
- encode
- expires
- httpOnly
- maxAge
- path
- sameSite
- secure