typescript - Bagaimana anda menambah data lajur tersuai ke jadual Pengguna menggunakan Penyedia Google OAuth dengan Next-Auth?
Baru-baru ini saya menemui dan mula menguji create-t3-app sebagai asas baru untuk projek NextJS kerana ia menguruskan banyak penyediaan asas untuk perkara seperti TypeScript, trpc, prisma, dan next-auth jadi ia akan menjimatkan banyak masa saya. Walaupun itu relevan, saya tidak fikir ia adalah punca masalah saya. Masalah saya ialah saya menggunakan perpustakaan next-auth dengan Penyedia Google untuk pengesahan dan saya ingin menjejaki jika emel telah disahkan.
skema.prisma
model User {
id String @id @default(cuid())
email String @unique
emailVerified Boolean @default(false)
password String?
role Role @default(USER)
name String?
image String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
accounts Account[]
sessions Session[]
}
[...nextauth].ts
GoogleProvider({
clientId: env.GOOGLE_CLIENT_ID,
clientSecret: env.GOOGLE_CLIENT_SECRET,
async profile(profile) {
return {
id: profile.sub, // I'd prefer not to have this but not supplying an id causes a TypeScript error
email: profile.email,
emailVerified: profile.email_verified ? true : false, // trying to turn undefined or null to true or false
// at_hash
name: profile.name,
image: profile.picture
// given_name, family_name
// locale
}
}
})
Saya mendapat ralat ini walaupun apabila saya log profil ia menunjukkan email_verified adalah benar:
Invalid `p.user.create()` invocation in
project/node_modules/@next-auth/prisma-adapter/dist/index.js:6:38
3 exports.PrismaAdapter = void 0;
4 function PrismaAdapter(p) {
5 return {
→ 6 createUser: (data) => p.user.create({
data: {
email: '[email ',
emailVerified: null,
~~~~
name: 'Dillan Wilding',
image: 'https://lh3.googleusercontent.com/a/AEdFTp6-ViCSaOvUJMTH3hVpajCfagYI73vx1uPVDYbuTw=s96-c'
}
})
Argument emailVerified for data.emailVerified must not be null. Please use undefined instead.
Saya cuba menamakan semula lajur daripada emailVerified kepada email_verified tetapi ia tidak diteruskan dalam definisi lalai fungsi profile() dalam Penyedia Google.
Satu-satunya perkara yang berkesan adalah menjadikan lajur emailVerified boleh dikosongkan (atau mengalihnya) dan penciptaan serta pengesahan Pengguna hanya tidak menggunakan lajur itu tetapi pengesahan tetap berfungsi. Itu sangat terhad untuk tidak membenarkan sifat tersuai.
Saya akan menghargai bantuan untuk cuba mencari cara mengisi email_verified atau emailVerified pada jadual Pengguna menggunakan Penyedia Google next-auth.
Selain itu, saya menggunakan beberapa versi terkini dan mendapati bahawa beberapa tutorial agak ketinggalan zaman. Berikut adalah package.json saya:
"dependencies": {
"@next-auth/prisma-adapter": "~1.0.5",
"@prisma/client": "~4.9.0",
"@tanstack/react-query": "~4.20.4",
"@trpc/client": "~10.6.0",
"@trpc/next": "~10.6.0",
"@trpc/react-query": "~10.6.0",
"@trpc/server": "~10.6.0",
"next": "~13.1.2",
"next-auth": "~4.19.0",
"react": "~18.2.0",
"react-dom": "~18.2.0",
"react-icons": "~4.7.1",
"react-markdown": "~8.0.4",
"react-syntax-highlighter": "~15.5.0",
"remark-gfm": "~3.0.1",
"superjson": "~1.12.2",
"zod": "~3.20.2"
},
KEMASKINI: Saya telah mula melihat kod sumber pakej next-auth daripada bergantung pada dokumentasi. Dari pemerhatian awal, nampaknya di beberapa tempat boolean email_verified tersedia/digunakan dan di tempat lain tarikh/masa emailVerified tersedia/digunakan. Saya masih cuba memahami aliran kerja, bagaimana dan di mana saya boleh mengaitkan dengan proses itu, dan bila setiap satu tersedia tetapi saya rasa ini lebih hampir kepada jawapan.