n2kN
Convex Community3mo ago
19 replies
n2k

Using the Better Auth component in "use node" context

🔑AuthResolved
Coming from a different database, I'm in the process of migrating over to Convex (cloud, not self-hosted), and using Better Auth Convex component (local install) as auth solution.

Ideally I want to re-use the users's password hash, which are hashed using
argon2id
, this requires the node runtime instead of the default v8 runtime Convex uses.

When adding
"use node"
at the top of the
/convex/auth.ts
where I the
betterAuth
instance with the password hash override like so:
"use node";

export const createAuth = (ctx: GenericCtx<DataModel>, { optionsOnly } = { optionsOnly: false }) => {
  return betterAuth({
    ...
    emailAndPassword: {
      enabled: true,
      minPasswordLength: 12,
      password: {
        hash: async (password) => await argon2.hash(password),
        verify: async ({ hash, password }) => await argon2.verify(hash, password),
      },
    },
    ...
  });
};


this will causes the following errors (not only from
node:crypto
also
node:util
fs
,
path
and
os
)
✘ [ERROR] Could not resolve "node:crypto"

    node_modules/argon2/argon2.cjs:1:49:
      1 │ const { randomBytes, timingSafeEqual } = require("node:crypto");
        ╵                                                  ~~~~~~~~~~~~~

  The package "node:crypto" wasn't found on the file system but is built into node. Are you trying
  to bundle for node? You can use "platform: 'node'" to do that, which will remove this error.

It looks like you are using Node APIs from a file without the "use node" directive.
Split out actions using Node.js APIs like this into a new file only containing actions that uses "use node" so these actions will run in a Node.js environment.
For more information see https://docs.convex.dev/functions/runtimes#nodejs-runtime


this essentially means I can't override the password hash?
Was this page helpful?