1.0.2 • Published 9 months ago

@thestartupfactory/van-gauth v1.0.2

Weekly downloads
-
License
-
Repository
-
Last release
9 months ago

Van-Gauth

The users of this library will interact through the Clients, created by calling {@link ByEmailPassword} or {@link ByToken}.

{@link ByToken} generates a set of auth primitives for authenticating users using a JWT, returning a {@link Clients.ByToken ByTokenClient}.

{@link ByEmailPassword} extends these to also allow authentication by email and password, returning a {@link Clients.ByEmailPassword ByEmailPasswordClient}.

Each requires a configuration containing both:

  • An object of callbacks {@link Connectors}, either {@link Connectors.ByEmailPassword} or {@link Connectors.ByToken} depending on the client you wish to use used internally within the library
  • Configuration settings, mainly optional, that cover items like Cookie names / Session Timeouts, etc.

Example Usage:

const parseClaims = iots.decode_to_result(claims);

const findUserByEmail = async (email: string): Promise<User | undefined> => {
  const result = await db.user.findUnique({
    where: { email },
  });
  return result ?? undefined;
};

const findUserByClaims = async (token: Claims): Promise<User | undefined> => {
  const result = await db.user.findUnique({
    where: { id: token.id },
  });
  if (!result) {
    return undefined;
  }
  return result;
};

const generateClaims = (user: User): Claims => ({
  id: user.id,
  email: user.email,
  role: user.role,
  status: user.status,
  plan: user.plan,
  featureFlags: user.featureFlags,
  notificationsEnabled: user.notificationsEnabled,
  activeBookId: user.activeBookId ?? undefined,
});

const updatePasswordByClaims = async (token: Claims, toStore: string) => {
  const updated_user = await db.user.update({
    data: { password: toStore, status: 'ACTIVE' },
    where: { id: token.id },
  });
  return updated_user;
};

const connector = {
  parseClaims,
  generateClaims,
  findUserByEmail: findUserByEmail(db),
  findUserByClaims: findUserByClaims(db),
  updatePasswordByClaims: updatePasswordByClaims(db),
};
const authClient = VG.ByEmailPassword({
  connector,
  jwt: {
    secret: config.jwt_secret,
  },
  cookie_name: COOKIE_NAME,
  session_timeout: SESSION_TIMEOUT,
});

// This client is then used throughout the application:
const result = await authClient.signInWithEmailAndPassword({
  email: 'me@email.com',
  password: 'password123',
  cookieSetter: response,
});
if (result.success) {
  console.log('Yay, you are signed in.');
} else {
  console.error(`Failed to sign in: ${result.error.message}`);
}