### 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.
43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
'use server'
|
|
|
|
import type { CollectionSlug } from 'payload'
|
|
|
|
import { headers as nextHeaders } from 'next/headers.js'
|
|
import { getPayload } from 'payload'
|
|
|
|
import { getExistingAuthToken } from '../utilities/getExistingAuthToken.js'
|
|
import { setPayloadAuthCookie } from '../utilities/setPayloadAuthCookie.js'
|
|
|
|
export async function refresh({ collection, config }: { collection: CollectionSlug; config: any }) {
|
|
try {
|
|
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 { user } = await payload.auth({ headers: await nextHeaders() })
|
|
if (!user) {
|
|
throw new Error('User not authenticated')
|
|
}
|
|
|
|
const existingCookie = await getExistingAuthToken(payload.config.cookiePrefix)
|
|
|
|
if (!existingCookie) {
|
|
return { message: 'No valid token found', success: false }
|
|
}
|
|
|
|
await setPayloadAuthCookie({
|
|
authConfig,
|
|
cookiePrefix: payload.config.cookiePrefix,
|
|
token: existingCookie.value,
|
|
})
|
|
|
|
return { message: 'Token refreshed successfully', success: true }
|
|
} catch (e) {
|
|
console.error('Refresh error:', e)
|
|
throw new Error(`${e}`)
|
|
}
|
|
}
|