Breaking down mega-package. Hello auth-db 1.0.0!
This commit is contained in:
15
lib/utils/getDefaultExpiresFor.ts
Normal file
15
lib/utils/getDefaultExpiresFor.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { LOGIN_VALID_TIMEOUT, RESET_VALID_TIMEOUT, VERIFY_VALID_TIMEOUT } from '../constants/env';
|
||||
import { TokenType } from '../constants/tokens';
|
||||
import { parseTimeoutToMs } from '../utils/parseTimeoutToMs';
|
||||
|
||||
export const getDefaultExpiresFor = (type: TokenType | void) => {
|
||||
if (type === TokenType.RESET) {
|
||||
return Date.now() + parseTimeoutToMs(RESET_VALID_TIMEOUT);
|
||||
}
|
||||
|
||||
if (type === TokenType.VERIFICATION) {
|
||||
return Date.now() + parseTimeoutToMs(VERIFY_VALID_TIMEOUT);
|
||||
}
|
||||
|
||||
return Date.now() + parseTimeoutToMs(LOGIN_VALID_TIMEOUT);
|
||||
};
|
||||
11
lib/utils/getLoginToken.ts
Normal file
11
lib/utils/getLoginToken.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { sign } from '../utils/jwt';
|
||||
import { LOGIN_VALID_TIMEOUT } from '../constants/env';
|
||||
import { parseTimeoutToMs } from '../utils/parseTimeoutToMs';
|
||||
import { AuthDocument } from '../schema/auth';
|
||||
|
||||
export const getLoginToken = ({ record: sub, status }: AuthDocument) =>
|
||||
sign({
|
||||
sub: <string>sub,
|
||||
status,
|
||||
exp: Date.now() + parseTimeoutToMs(LOGIN_VALID_TIMEOUT),
|
||||
});
|
||||
35
lib/utils/jwt.ts
Normal file
35
lib/utils/jwt.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import jwt from 'jsonwebtoken';
|
||||
import { JWT_AUDIENCE, JWT_ISSUER, JWT_SECRET } from '../constants/env';
|
||||
export interface TokenProps {
|
||||
aud?: string;
|
||||
exp?: number | Date;
|
||||
iss?: string;
|
||||
sub: string | null;
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
export type SignProps = string | TokenProps | void;
|
||||
|
||||
export const sign = (props: SignProps) => {
|
||||
const today = new Date();
|
||||
const { sub = null, ...rest }: TokenProps =
|
||||
typeof props === 'string' || typeof props === 'undefined' ? { sub: props || null } : props;
|
||||
let { exp } = rest;
|
||||
if (!exp) {
|
||||
exp = new Date(today);
|
||||
exp.setDate(today.getDate() + parseInt(process.env.JWT_DAYS_VALID as string));
|
||||
exp = exp.getTime() / 1000;
|
||||
}
|
||||
return jwt.sign(
|
||||
{
|
||||
exp,
|
||||
sub,
|
||||
aud: rest.aud || JWT_AUDIENCE,
|
||||
iat: today.getTime(),
|
||||
iss: rest.iss || JWT_ISSUER,
|
||||
},
|
||||
JWT_SECRET,
|
||||
);
|
||||
};
|
||||
|
||||
export const verify = (token: string) => jwt.verify(token, JWT_SECRET);
|
||||
5
lib/utils/links.ts
Normal file
5
lib/utils/links.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import { RESET_ROUTE, ROUTE_PREFIX, VERIFICATION_ROUTE } from '../constants/env';
|
||||
|
||||
export const getPasswordResetPath = (token: string) => `${ROUTE_PREFIX}${RESET_ROUTE}?t=${token}`;
|
||||
|
||||
export const getVerificationPath = (token: string) => `${ROUTE_PREFIX}${VERIFICATION_ROUTE}?t=${token}`;
|
||||
13
lib/utils/parseTimeoutToMs.ts
Normal file
13
lib/utils/parseTimeoutToMs.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
export const parseTimeoutToMs = (timeout: string) => {
|
||||
const match = timeout.match(/(?<number>\d+)(?<unit>d|h|m)/gi)?.groups || {};
|
||||
const { number, unit } = match;
|
||||
switch (unit) {
|
||||
case 'd':
|
||||
return 1000 * 60 * 60 * 24 * parseInt(number);
|
||||
case 'h':
|
||||
return 1000 * 60 * 60 * parseInt(number);
|
||||
case 'm':
|
||||
default:
|
||||
return 1000 * 60 * parseInt(number) || 1;
|
||||
}
|
||||
};
|
||||
12
lib/utils/password.ts
Normal file
12
lib/utils/password.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { pbkdf2Sync, randomBytes } from 'crypto';
|
||||
|
||||
export const encrypt = (password: string) => {
|
||||
const salt = randomBytes(16).toString('hex');
|
||||
const hash = pbkdf2Sync(password, salt, 10000, 512, 'sha512').toString('hex');
|
||||
return `${salt}:${hash}`;
|
||||
};
|
||||
|
||||
export const verify = (test: string, secret: string) => {
|
||||
const [salt, hash] = secret.split(':');
|
||||
return pbkdf2Sync(test, salt, 10000, 512, 'sha512').toString('hex') === hash;
|
||||
};
|
||||
11
lib/utils/tokens.ts
Normal file
11
lib/utils/tokens.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { sign } from './jwt';
|
||||
import { LOGIN_VALID_TIMEOUT } from '../constants/env';
|
||||
import { Status } from '../constants/auth';
|
||||
import { parseTimeoutToMs } from './parseTimeoutToMs';
|
||||
|
||||
export const generateLoginToken = (sub: string, status: Status) =>
|
||||
sign({
|
||||
sub,
|
||||
status,
|
||||
exp: Date.now() + parseTimeoutToMs(LOGIN_VALID_TIMEOUT),
|
||||
});
|
||||
Reference in New Issue
Block a user