payload-authjs
Version:
A Payload CMS 3 plugin for Auth.js 5
68 lines (67 loc) • 2.7 kB
JavaScript
import NextAuth from "next-auth";
import { withPayload } from "../authjs/withPayload";
import { getAllVirtualFields } from "./utils/getAllVirtualFields";
import { getUserAttributes } from "./utils/getUserAttributes";
export const AUTHJS_STRATEGY_NAME = "Auth.js";
/**
* Auth.js Authentication Strategy for Payload CMS
* @see https://payloadcms.com/docs/authentication/custom-strategies
*/ export function AuthjsAuthStrategy(collection, pluginOptions) {
// Get all virtual fields
const virtualFields = getAllVirtualFields(collection.fields);
return {
name: AUTHJS_STRATEGY_NAME,
authenticate: async ({ payload, isGraphQL })=>{
// Get session from authjs
const { auth } = NextAuth(withPayload(pluginOptions.authjsConfig, {
payload,
userCollectionSlug: collection.slug
}));
const session = await auth();
// If no session, return null user
if (!session?.user) {
return {
user: null
};
}
// Find user in database
const sanitizedCollectionConfig = payload.collections[collection.slug].config;
const payloadUser = (await payload.find({
collection: collection.slug,
where: session.user.id ? {
id: {
equals: session.user.id
}
} : {
email: {
equals: session.user.email
}
},
depth: isGraphQL ? 0 : sanitizedCollectionConfig.auth.depth,
limit: 1
})).docs.at(0);
// If user does not exist in the database, log a warning and return null user
if (!payloadUser) {
payload.logger.warn({
name: "payload-authjs (AuthjsAuthStrategy)",
session
}, `User '${session.user.id ?? session.user.email}' has a valid Auth.js session but does not exist in the payload database.`);
return {
user: null
};
}
// Get user virtual fields
const virtualSessionFields = getUserAttributes(session.user, virtualFields);
// Return user to payload cms
return {
user: {
_strategy: AUTHJS_STRATEGY_NAME,
collection: collection.slug,
...payloadUser,
...virtualSessionFields
}
};
}
};
}
//# sourceMappingURL=AuthjsAuthStrategy.js.map