@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 4.85 kB
Source Map (JSON)
{"version":3,"file":"generate-token.mjs","names":["constants"],"sources":["../../../../src/services/auth/refresh-token/generate-token.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { getCookie, setCookie } from \"hono/cookie\";\nimport { sign } from \"hono/jwt\";\nimport constants from \"../../../constants/constants.js\";\nimport createServiceContext from \"../../../libs/http/utils/create-service-context.js\";\nimport cacheKeys from \"../../../libs/kv/cache-keys.js\";\nimport { UserTokensRepository } from \"../../../libs/repositories/index.js\";\nimport type { LucidHonoContext } from \"../../../types/hono.js\";\nimport hashUserToken from \"../../../utils/helpers/hash-user-token.js\";\nimport { isRequestSecure } from \"../../../utils/helpers/index.js\";\nimport type { ServiceResponse } from \"../../../utils/services/types.js\";\nimport clearToken from \"./clear-token.js\";\n\nconst generateToken = async (\n\tc: LucidHonoContext,\n\tuserId: number,\n): ServiceResponse<{ tokenId: number }> => {\n\tconst existingRefreshToken = getCookie(c, constants.cookies.refreshToken);\n\n\tconst clearRes = await clearToken(c, {\n\t\trevokeReason: constants.refreshTokenRevokeReasons.rotated,\n\t\tconsume: true,\n\t});\n\tif (clearRes.error) return clearRes;\n\n\tconst config = c.get(\"config\");\n\n\tconst UserTokens = new UserTokensRepository(\n\t\tc.get(\"database\").client,\n\t\tconfig.db,\n\t);\n\n\tconst now = Date.now();\n\tconst nonce = randomBytes(8).toString(\"hex\");\n\n\tconst token = await sign(\n\t\t{\n\t\t\tid: userId,\n\t\t\texp: Math.floor(now / 1000) + constants.refreshTokenExpiration,\n\t\t\tiat: Math.floor(now / 1000),\n\t\t\tnonce: nonce,\n\t\t},\n\t\tconfig.secrets.refreshToken,\n\t\tconstants.jwt.algorithm,\n\t);\n\tconst hashedToken = hashUserToken(token);\n\n\tconst createTokenRes = await UserTokens.createSingle({\n\t\tdata: {\n\t\t\tuser_id: userId,\n\t\t\ttoken: hashedToken,\n\t\t\ttoken_type: constants.userTokens.refresh,\n\t\t\texpiry_date: new Date(\n\t\t\t\tDate.now() + constants.refreshTokenExpiration * 1000, // convert to ms\n\t\t\t).toISOString(),\n\t\t},\n\t\treturning: [\"id\"],\n\t\tvalidation: {\n\t\t\tenabled: true,\n\t\t},\n\t});\n\tif (createTokenRes.error) return createTokenRes;\n\n\tif (existingRefreshToken) {\n\t\tconst hashedExistingRefreshToken = hashUserToken(existingRefreshToken);\n\t\tconst updateRotatedTokenRes = await UserTokens.updateMultiple({\n\t\t\tdata: {\n\t\t\t\treplaced_by_token_id: createTokenRes.data.id,\n\t\t\t},\n\t\t\twhere: [\n\t\t\t\t{\n\t\t\t\t\tkey: \"token\",\n\t\t\t\t\toperator: \"=\",\n\t\t\t\t\tvalue: hashedExistingRefreshToken,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkey: \"token_type\",\n\t\t\t\t\toperator: \"=\",\n\t\t\t\t\tvalue: constants.userTokens.refresh,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t\tif (updateRotatedTokenRes.error) return updateRotatedTokenRes;\n\t}\n\n\tsetCookie(c, constants.cookies.refreshToken, token, {\n\t\tmaxAge: constants.refreshTokenExpiration,\n\t\thttpOnly: true,\n\t\tsecure: isRequestSecure(c),\n\t\tsameSite: \"strict\",\n\t\tpath: \"/\",\n\t});\n\n\tconst context = createServiceContext(c);\n\tconst kv = context.kv;\n\n\tawait kv.set(context, {\n\t\tkey: cacheKeys.auth.refresh(token),\n\t\tvalue: { user_id: userId },\n\t\texpirationTtl: constants.refreshTokenExpiration,\n\t\thash: true,\n\t});\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: {\n\t\t\ttokenId: createTokenRes.data.id,\n\t\t},\n\t};\n};\n\nexport default generateToken;\n"],"mappings":"ofAaA,MAAM,EAAgB,MACrB,EACA,IAC0C,CAC1C,IAAM,EAAuB,EAAU,EAAGA,EAAU,QAAQ,YAAY,EAElE,EAAW,MAAM,EAAW,EAAG,CACpC,aAAcA,EAAU,0BAA0B,QAClD,QAAS,EACV,CAAC,EACD,GAAI,EAAS,MAAO,OAAO,EAE3B,IAAM,EAAS,EAAE,IAAI,QAAQ,EAEvB,EAAa,IAAI,EACtB,EAAE,IAAI,UAAU,CAAC,CAAC,OAClB,EAAO,EACR,EAEM,EAAM,KAAK,IAAI,EACf,EAAQ,EAAY,CAAC,CAAC,CAAC,SAAS,KAAK,EAErC,EAAQ,MAAM,EACnB,CACC,GAAI,EACJ,IAAK,KAAK,MAAM,EAAM,GAAI,EAAIA,EAAU,uBACxC,IAAK,KAAK,MAAM,EAAM,GAAI,EACnB,OACR,EACA,EAAO,QAAQ,aACfA,EAAU,IAAI,SACf,EACM,EAAc,EAAc,CAAK,EAEjC,EAAiB,MAAM,EAAW,aAAa,CACpD,KAAM,CACL,QAAS,EACT,MAAO,EACP,WAAYA,EAAU,WAAW,QACjC,YAAa,IAAI,KAChB,KAAK,IAAI,EAAIA,EAAU,uBAAyB,GACjD,CAAC,CAAC,YAAY,CACf,EACA,UAAW,CAAC,IAAI,EAChB,WAAY,CACX,QAAS,EACV,CACD,CAAC,EACD,GAAI,EAAe,MAAO,OAAO,EAEjC,GAAI,EAAsB,CACzB,IAAM,EAA6B,EAAc,CAAoB,EAC/D,EAAwB,MAAM,EAAW,eAAe,CAC7D,KAAM,CACL,qBAAsB,EAAe,KAAK,EAC3C,EACA,MAAO,CACN,CACC,IAAK,QACL,SAAU,IACV,MAAO,CACR,EACA,CACC,IAAK,aACL,SAAU,IACV,MAAOA,EAAU,WAAW,OAC7B,CACD,CACD,CAAC,EACD,GAAI,EAAsB,MAAO,OAAO,CACzC,CAEA,EAAU,EAAGA,EAAU,QAAQ,aAAc,EAAO,CACnD,OAAQA,EAAU,uBAClB,SAAU,GACV,OAAQ,EAAgB,CAAC,EACzB,SAAU,SACV,KAAM,GACP,CAAC,EAED,IAAM,EAAU,EAAqB,CAAC,EAUtC,OAPA,MAFW,EAAQ,GAEV,IAAI,EAAS,CACrB,IAAK,EAAU,KAAK,QAAQ,CAAK,EACjC,MAAO,CAAE,QAAS,CAAO,EACzB,cAAeA,EAAU,uBACzB,KAAM,EACP,CAAC,EAEM,CACN,MAAO,IAAA,GACP,KAAM,CACL,QAAS,EAAe,KAAK,EAC9B,CACD,CACD"}