@youngshand/payload-auth-plugin
Version:
A temporary fork for testing of Authentication plugin for Payload CMS, use @payload-auth-plugin
123 lines (113 loc) • 2.75 kB
text/typescript
import { parseCookies, PayloadRequest } from "payload"
import {
UnauthorizedAPIRequest,
UserNotFoundAPIError,
} from "../errors/apiErrors.js"
import { createSessionCookies, verifySessionCookie } from "../utils/cookies.js"
import { ErrorKind, SuccessKind } from "../../types.js"
export const SessionRefresh = async (
cookieName: string,
secret: string,
request: PayloadRequest,
) => {
const cookies = parseCookies(request.headers)
const token = cookies.get(cookieName)
if (!token) {
return new UnauthorizedAPIRequest()
}
const jwtResponse = await verifySessionCookie(token, secret)
if (!jwtResponse.payload) {
return new UnauthorizedAPIRequest()
}
let refreshCookies: string[] = []
refreshCookies = [
...(await createSessionCookies(cookieName, secret, jwtResponse.payload)),
]
const res = new Response(
JSON.stringify({
message: "Session refreshed",
kind: SuccessKind.Updated,
isSuccess: true,
isError: false,
}),
{
status: 201,
},
)
refreshCookies.forEach((cookie) => {
res.headers.append("Set-Cookie", cookie)
})
return res
}
export const UserSession = async (
cookieName: string,
secret: string,
request: PayloadRequest,
internal: {
usersCollectionSlug: string
},
fields: string[],
) => {
const cookies = parseCookies(request.headers)
const token = cookies.get(cookieName)
console.log(cookies.get("payload-token"))
if (!token) {
return new Response(
JSON.stringify({
message: "Missing user session",
kind: ErrorKind.NotAuthenticated,
data: {
isAuthenticated: false,
},
}),
{
status: 403,
},
)
}
const jwtResponse = await verifySessionCookie(token, secret)
if (!jwtResponse.payload) {
return new Response(
JSON.stringify({
message: "Invalid user session",
kind: ErrorKind.NotAuthenticated,
data: {
isAuthenticated: false,
},
isSuccess: false,
isError: true,
}),
{
status: 401,
},
)
}
const doc = await request.payload.findByID({
collection: internal.usersCollectionSlug,
id: jwtResponse.payload.id,
})
if (!doc?.id) {
return new UserNotFoundAPIError()
}
const queryData: Record<string, unknown> = {}
fields.forEach((field) => {
if (Object.hasOwn(doc, field)) {
queryData[field] = doc[field]
}
})
return new Response(
JSON.stringify({
message: "Fetched user session",
kind: SuccessKind.Retrieved,
data: {
isAuthenticated: true,
...queryData,
},
isSuccess: true,
isError: false,
}),
{
status: 201,
},
)
}