2024-08-11
【Tips - Clerk】実例でわかるシリーズ
<前置き、挨拶>
みなさんどうも、こんばんみ~。ぎょうざです。
Webアプリ上などでユーザー認証機能を実装する際に便利なツール
Clerk(クラーク)を利用する際に、ぎょうざが躓いたところを備忘録として記録しておきます。
同じようなケースあるいは現象で困っている方の参考になれば幸いです。
【目次】
<Useful> ▶ <Error> ▶ userId (※ぎょうざ独自にPrismaのSchemaに定義) をSupabaseのDBにPOSTできない ▶ npm run dev で 開発コンソール上でGET / 307が連続で表示される <Warn> ▶ 〆の一言
<Useful>
▶
<Error>
▶ userId (※ぎょうざ独自にPrismaのSchemaに定義) をSupabaseのDBにPOSTできない
- 現象:TypeError: (0 , clerk_nextjs__WEBPACK_IMPORTED_MODULE_2_.useAuth) is not a function
- 原因:Internal Error 500

- 解決策:import元を
import { useAuth } “@clerk/nextjs”
からimport { auth } “@clerk/nextjs/server”
へ変更
▶ npm run dev で 開発コンソール上でGET / 307が連続で表示される
- 現象:ブラウザ表示画面上で、
ERR_TOO_MANY_REDIRECTS
がエラー表示される - 原因:Next.jsとClerkの認証設定が競合してリダイレクトが繰り返されている 💡原因を推測するに、
middleware.ts
のisPublicRoute
とconfig.matcher
の設定が競合していた可能性があります。具体的には、
-
localhost:3000
にアクセスすると、middleware.ts
が実行されます。 -
/
がisPublicRoute
に含まれているため、userAuth.protect()
は実行されません。 - しかし、
config.matcher
の設定により、localhost:3000
はミドルウェアの対象となります。 - その結果、Clerk のミドルウェアが何らかの処理を行い、意図しないリダイレクトが発生していた可能性があります。
/
をisPublicRoute
から削除することで、localhost:3000
へのアクセス時にuserAuth.protect()
が実行されるようになり、Clerk のサインインページへのリダイレクトが正しく行われるようになったと考えられます。Clerk のミドルウェアは、認証が必要なページにアクセスがあった際に、ユーザーをサインインページにリダイレクトする役割を担います。
/
をisPublicRoute
に含めていた場合、ルートページへのアクセスも認証が必要と判断され、リダイレクトが発生していた可能性があります。ただし、
/
をisPublicRoute
から削除することで、ルートページへのアクセスが常に認証を要求されるようになります。もしルートページを認証なしでアクセスできるようにしたい場合は、別の方法で対応する必要があります。 -
- 解決策:isPublicRouteからルートページ、自分の場合は
'/'
を削除
<Warn>
▶
〆の一言
Clerkは、ユーザー認証機能を簡単に実装できるツールとして優秀です。
メール認証だけにとどまらず、Google認証やSNS認証なども可能です。
ここまで読んでいただき、ありがとうございました。
以上、ぎょうざでした。