1.0.2 • Published 9 months ago
@thestartupfactory/van-gauth v1.0.2
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}`);
}