UNPKG

payload

Version:

Node, React, Headless CMS and Application Framework built on Next.js

105 lines (104 loc) 3.27 kB
// @ts-strict-ignore import { jwtVerify } from 'jose'; import { extractJWT } from '../extractJWT.js'; async function autoLogin({ isGraphQL, payload, strategyName = 'local-jwt' }) { if (typeof payload?.config?.admin?.autoLogin !== 'object' || payload.config.admin?.autoLogin.prefillOnly || !payload?.config?.admin?.autoLogin || !payload.config.admin?.autoLogin.email && !payload.config.admin?.autoLogin.username) { return { user: null }; } const collection = payload.collections[payload.config.admin.user]; const where = { or: [] }; if (payload.config.admin?.autoLogin.email) { where.or?.push({ email: { equals: payload.config.admin?.autoLogin.email } }); } else if (payload.config.admin?.autoLogin.username) { where.or?.push({ username: { equals: payload.config.admin?.autoLogin.username } }); } const user = (await payload.find({ collection: collection.config.slug, depth: isGraphQL ? 0 : collection.config.auth.depth, limit: 1, pagination: false, where })).docs[0]; if (!user) { return { user: null }; } user.collection = collection.config.slug; user._strategy = strategyName; return { user }; } /** * Authentication strategy function for JWT tokens */ export const JWTAuthentication = async ({ headers, isGraphQL = false, payload, strategyName = 'local-jwt' })=>{ try { const token = extractJWT({ headers, payload }); if (!token) { if (headers.get('DisableAutologin') !== 'true') { return await autoLogin({ isGraphQL, payload, strategyName }); } return { user: null }; } const secretKey = new TextEncoder().encode(payload.secret); const { payload: decodedPayload } = await jwtVerify(token, secretKey); const collection = payload.collections[decodedPayload.collection]; const user = await payload.findByID({ id: decodedPayload.id, collection: decodedPayload.collection, depth: isGraphQL ? 0 : collection.config.auth.depth }); if (user && (!collection.config.auth.verify || user._verified)) { user.collection = collection.config.slug; user._strategy = strategyName; return { user }; } else { if (headers.get('DisableAutologin') !== 'true') { return await autoLogin({ isGraphQL, payload, strategyName }); } return { user: null }; } } catch (ignore) { if (headers.get('DisableAutologin') !== 'true') { return await autoLogin({ isGraphQL, payload, strategyName }); } return { user: null }; } }; //# sourceMappingURL=jwt.js.map