TodoにownerIdを設定しようとしましたが、なぜか、ログインしてもsession.idが設定されていません。
session.emailとsession.nameは設定されているのでsession自体はできているようです。
そういえば、CredentialProviderを使うように変更したとき、
session関数のuserパラメータが必ずundefineになるので意味ないと思って消したのでした。
ここら辺消してはまずかったのか?
export const authOptions: NextAuthOptions = {
- // Include user.id on session
- callbacks: {
- session({ session, user }) {
- if (session.user) {
- session.user.id = user.id;
- }
- return session;
- },
- },
- // Configure one or more authentication providers
- adapter: PrismaAdapter(prisma),
providers: [
ここを読むと、
- データベースセッションを利用している場合、userオブジェクトが引数として渡されます。
- JSON Web Tokensをセッションとして利用している場合、JWT payloadが代わりに渡されます。
とあるので、JWTを利用するときはuserではなくて、tokenプロパティを利用しなければならないみたいです。
callbacks: {
async session({ session, token, user }) {
// Send properties to the client, like an access_token and user id from a provider.
session.accessToken = token.accessToken
session.user.id = token.id
return session
}
}
試しに、公式サイトにある通り、token.idをsession.user.idに代入する処理を行ってみましたが、
確かにtokenはわたってきますが、token.idはやっぱりundefineでした。
さっぱりわからない。tokenにはどんな内容が入ってくるんだろうと思ってデバックを有効にして、Next.jsを立ち上げてみたら
以下のようでした。
どうやら、idではなくsubプロパティにidが入っているようです。
import { prisma } from "../../../server/db/client";
export const authOptions: NextAuthOptions = {
+ secret: env.NEXTAUTH_SECRET,
+ // Include user.id on session
+ callbacks: {
+ session({ session, token }) {
+ if (session.user != null && token.sub != null) {
+ session.user.id = token.sub;
+ }
+ return session;
+ },
+ },
providers: [
以上のようにしたところ無事、seesion.idにidが設定されるようになりました。
やはり、公式サイトはよく読まなければなりません。
ここまでの変更は以下の通りです。