### What Adds exportable server functions for `login`, `logout` and `refresh` that are fully typed and ready to use. ### Why Creating server functions for these auth operations require the developer to manually set and handle the cookies / auth JWT. This can be a complex and involved process - instead we want to provide an option that will handle the cookies internally and simplify the process for the user. ### How Three re-usable functions can be exported from `@payload/next/server-functions`: - login - logout - refresh Examples of how to use these functions will be added to the docs shortly, along with more in-depth info on server functions.
88 lines
1.9 KiB
TypeScript
88 lines
1.9 KiB
TypeScript
'use server'
|
|
|
|
import type { CollectionSlug } from 'payload'
|
|
|
|
import { cookies as getCookies } from 'next/headers.js'
|
|
import { generatePayloadCookie, getPayload } from 'payload'
|
|
|
|
import { setPayloadAuthCookie } from '../utilities/setPayloadAuthCookie.js'
|
|
|
|
type LoginWithEmail = {
|
|
collection: CollectionSlug
|
|
config: any
|
|
email: string
|
|
password: string
|
|
username?: never
|
|
}
|
|
|
|
type LoginWithUsername = {
|
|
collection: CollectionSlug
|
|
config: any
|
|
email?: never
|
|
password: string
|
|
username: string
|
|
}
|
|
type LoginArgs = LoginWithEmail | LoginWithUsername
|
|
|
|
export async function login({ collection, config, email, password, username }: LoginArgs): Promise<{
|
|
token?: string
|
|
user: any
|
|
}> {
|
|
const payload = await getPayload({ config })
|
|
|
|
const authConfig = payload.collections[collection]?.config.auth
|
|
if (!authConfig) {
|
|
throw new Error(`No auth config found for collection: ${collection}`)
|
|
}
|
|
|
|
const loginWithUsername = authConfig?.loginWithUsername ?? false
|
|
|
|
if (loginWithUsername) {
|
|
if (loginWithUsername.allowEmailLogin) {
|
|
if (!email && !username) {
|
|
throw new Error('Email or username is required.')
|
|
}
|
|
} else {
|
|
if (!username) {
|
|
throw new Error('Username is required.')
|
|
}
|
|
}
|
|
} else {
|
|
if (!email) {
|
|
throw new Error('Email is required.')
|
|
}
|
|
}
|
|
|
|
let loginData
|
|
|
|
if (loginWithUsername) {
|
|
loginData = username ? { password, username } : { email, password }
|
|
} else {
|
|
loginData = { email, password }
|
|
}
|
|
|
|
try {
|
|
const result = await payload.login({
|
|
collection,
|
|
data: loginData,
|
|
})
|
|
|
|
if (result.token) {
|
|
await setPayloadAuthCookie({
|
|
authConfig,
|
|
cookiePrefix: payload.config.cookiePrefix,
|
|
token: result.token,
|
|
})
|
|
}
|
|
|
|
if ('removeTokenFromResponses' in config && config.removeTokenFromResponses) {
|
|
delete result.token
|
|
}
|
|
|
|
return result
|
|
} catch (e) {
|
|
console.error('Login error:', e)
|
|
throw new Error(`${e}`)
|
|
}
|
|
}
|