Refactor to use ai/rsc (#253)
This commit is contained in:
parent
69ca8fcc22
commit
e85ba803dd
66 changed files with 2799 additions and 740 deletions
89
auth.ts
89
auth.ts
|
|
@ -1,39 +1,62 @@
|
|||
import NextAuth, { type DefaultSession } from 'next-auth'
|
||||
import GitHub from 'next-auth/providers/github'
|
||||
import NextAuth from 'next-auth'
|
||||
import Credentials from 'next-auth/providers/credentials'
|
||||
import { authConfig } from './auth.config'
|
||||
import { z } from 'zod'
|
||||
import { sql } from '@vercel/postgres'
|
||||
import { getStringFromBuffer } from './lib/utils'
|
||||
|
||||
declare module 'next-auth' {
|
||||
interface Session {
|
||||
user: {
|
||||
/** The user's id. */
|
||||
id: string
|
||||
} & DefaultSession['user']
|
||||
interface User {
|
||||
id: string
|
||||
name: string
|
||||
email: string
|
||||
password: string
|
||||
salt: string
|
||||
}
|
||||
|
||||
async function getUser(email: string): Promise<User | undefined> {
|
||||
try {
|
||||
const user = await sql<User>`SELECT * FROM users WHERE email=${email}`
|
||||
return user.rows[0]
|
||||
} catch (error) {
|
||||
throw new Error('Failed to fetch user.')
|
||||
}
|
||||
}
|
||||
|
||||
export const {
|
||||
handlers: { GET, POST },
|
||||
auth
|
||||
} = NextAuth({
|
||||
providers: [GitHub],
|
||||
callbacks: {
|
||||
jwt({ token, profile }) {
|
||||
if (profile) {
|
||||
token.id = profile.id
|
||||
token.image = profile.avatar_url || profile.picture
|
||||
export const { auth, signIn, signOut } = NextAuth({
|
||||
...authConfig,
|
||||
providers: [
|
||||
Credentials({
|
||||
async authorize(credentials) {
|
||||
const parsedCredentials = z
|
||||
.object({
|
||||
email: z.string().email(),
|
||||
password: z.string().min(6)
|
||||
})
|
||||
.safeParse(credentials)
|
||||
|
||||
if (parsedCredentials.success) {
|
||||
const { email, password } = parsedCredentials.data
|
||||
const user = await getUser(email)
|
||||
|
||||
if (!user) return null
|
||||
|
||||
const encoder = new TextEncoder()
|
||||
const saltedPassword = encoder.encode(password + user.salt)
|
||||
const hashedPasswordBuffer = await crypto.subtle.digest(
|
||||
'SHA-256',
|
||||
saltedPassword
|
||||
)
|
||||
const hashedPassword = getStringFromBuffer(hashedPasswordBuffer)
|
||||
|
||||
if (hashedPassword === user.password) {
|
||||
return user
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
return token
|
||||
},
|
||||
session: ({ session, token }) => {
|
||||
if (session?.user && token?.id) {
|
||||
session.user.id = String(token.id)
|
||||
}
|
||||
return session
|
||||
},
|
||||
authorized({ auth }) {
|
||||
return !!auth?.user // this ensures there is a logged in user for -every- request
|
||||
}
|
||||
},
|
||||
pages: {
|
||||
signIn: '/sign-in' // overrides the next-auth default signin page https://authjs.dev/guides/basics/pages
|
||||
}
|
||||
})
|
||||
]
|
||||
})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue