From 32bfbd7adca3a8e72688df21531537d9d4b04095 Mon Sep 17 00:00:00 2001 From: mifi Date: Wed, 3 May 2023 11:38:41 -0400 Subject: [PATCH] Finishing touches to publish --- lib/constants/db.ts | 5 +++++ lib/constants/{constants.ts => env.ts} | 3 +-- lib/db/index.ts | 5 +++++ lib/db/schema/auth.ts | 6 +++--- lib/server/controllers/auth.ts | 10 ++++------ lib/server/database/database.connection.ts | 9 --------- lib/server/{server.ts => index.ts} | 4 ++-- lib/server/middleware/authenication.ts | 2 +- lib/server/passport/index.ts | 2 +- lib/server/passport/strategies/jwt.ts | 6 +++--- lib/server/passport/strategies/local.ts | 2 +- lib/utils/jwt.ts | 2 +- lib/utils/links.ts | 2 +- lib/utils/tokens.ts | 14 +++++++------- package.json | 2 +- 15 files changed, 36 insertions(+), 38 deletions(-) create mode 100644 lib/constants/db.ts rename lib/constants/{constants.ts => env.ts} (97%) create mode 100644 lib/db/index.ts delete mode 100644 lib/server/database/database.connection.ts rename lib/server/{server.ts => index.ts} (60%) diff --git a/lib/constants/db.ts b/lib/constants/db.ts new file mode 100644 index 0000000..34cd3db --- /dev/null +++ b/lib/constants/db.ts @@ -0,0 +1,5 @@ +export const DB_HOST = process.env.DB_HOST || 'mongodb'; +export const DB_PORT = process.env.DB_PORT || 27017; +export const DB_USER = process.env.DB_USER || 'test'; +export const DB_PASS = process.env.DB_PASSWORD || 'test'; +export const DB_NAME = process.env.DB_NAME || 'auth'; diff --git a/lib/constants/constants.ts b/lib/constants/env.ts similarity index 97% rename from lib/constants/constants.ts rename to lib/constants/env.ts index 66f8ab3..1a240de 100644 --- a/lib/constants/constants.ts +++ b/lib/constants/env.ts @@ -1,4 +1,3 @@ - export const PACKAGE_NAME = '@mifi/latch'; export const PORT = process.env.PORT || 9000; @@ -6,7 +5,7 @@ export const JWT_AUDIENCE = process.env.JWT_AUDIENCE || 'mifi.dev'; export const JWT_ISSUER = process.env.JWT_ISSUER || PACKAGE_NAME; export const JWT_SECRET = process.env.JWT_SECRET || 'secret'; -export const LOGIN_VALID_TIME = process.env.LOGIN_VALID_TIME || '12H'; // ###D|H|M +export const LOGIN_VALID_TIME = process.env.LOGIN_VALID_TIME || '12H'; // ###D|H|M export const RESET_VALID_MINUTES = process.env.RESET_VALID_MINUTES || 24; export const DEFAULT_TOKEN_DAYS = process.env.DEFAULT_TOKEN_DAYS || 365; diff --git a/lib/db/index.ts b/lib/db/index.ts new file mode 100644 index 0000000..7550277 --- /dev/null +++ b/lib/db/index.ts @@ -0,0 +1,5 @@ +import mongoose from 'mongoose'; + +import { DB_HOST, DB_NAME, DB_PASS, DB_PORT, DB_USER } from '../constants/db'; + +export const connection = mongoose.connect(`mongodb://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}`); diff --git a/lib/db/schema/auth.ts b/lib/db/schema/auth.ts index 074049b..ed8eb20 100644 --- a/lib/db/schema/auth.ts +++ b/lib/db/schema/auth.ts @@ -6,7 +6,7 @@ import { STRATEGIES } from '../../constants/strategies'; import { TokenProps, verify as verifyJwt } from '../../utils/jwt'; import { encrypt, verify as verifyPassword } from '../../utils/password'; import { generateLoginToken, generateResetToken } from '../../utils/tokens'; -import { getPasswordResetLink } from '../../utils/links'; +import { getPasswordResetPath } from '../../utils/links'; import { Status } from '../../constants/auth'; export type Auth = { @@ -42,7 +42,7 @@ export const AuthSchema = new Schema( { is2FA: { type: Boolean, default: false }, record: { type: Types.ObjectId }, - strategies: { type: Types.ArraySubdocument, required: true }, + strategies: { type: Array, required: true }, status: { type: Number, enum: Object.values(Status), default: Status.UNVERIFIED }, username: { type: String, required: true, unique: true }, }, @@ -69,7 +69,7 @@ AuthSchema.methods = { async getResetLink(route) { const token = await this.getResetToken(); if (token) { - const resetUrl = getPasswordResetLink(token); + const resetUrl = getPasswordResetPath(token); console.log('[sendPasswordReset] resetUrl:', resetUrl); return resetUrl; } diff --git a/lib/server/controllers/auth.ts b/lib/server/controllers/auth.ts index a943555..0211a0f 100644 --- a/lib/server/controllers/auth.ts +++ b/lib/server/controllers/auth.ts @@ -2,7 +2,7 @@ import Koa from 'koa'; import Router from 'koa-router'; import { StatusCodes } from 'http-status-codes'; -import { ROUTE_PREFIX as prefix, RESET_ROUTE } from '../../constants/constants'; +import { ROUTE_PREFIX as prefix, RESET_ROUTE } from '../../constants/env'; import Auth from '../../db/model/auth'; import { sign } from '../../utils/jwt'; import passport from '../passport'; @@ -28,7 +28,7 @@ router.post('/login', async (ctx, next) => { }); router.post(process.env.RESET_ROUTE || RESET_ROUTE, async (ctx, next) => { - const { token = null, password = null } = ctx.request.body as { token?: string, password?: string }; + const { token = null, password = null } = ctx.request.body as { token?: string; password?: string }; if (token && password) { const loginToken = await Auth.resetPassword(token, password).catch(); ctx.body({ token: loginToken }); @@ -38,13 +38,11 @@ router.post(process.env.RESET_ROUTE || RESET_ROUTE, async (ctx, next) => { }); router.patch('/:record', (ctx: Koa.Context) => { - const data = Auth.findOneAndUpdate( - { record: ctx.params.record }, - ); + const data = Auth.findOneAndUpdate({ record: ctx.params.record }); if (!data) { ctx.throw(StatusCodes.NOT_FOUND); } ctx.body = { success: true, data }; }); -export { router as authRouter }; \ No newline at end of file +export { router as authRouter }; diff --git a/lib/server/database/database.connection.ts b/lib/server/database/database.connection.ts deleted file mode 100644 index 4d1e780..0000000 --- a/lib/server/database/database.connection.ts +++ /dev/null @@ -1,9 +0,0 @@ -import mongoose from 'mongoose'; - -const DB_USER = process.env.DB_USER || 'test'; -const DB_PASS = process.env.DB_PASSWORD || 'test'; -const DB_HOST = process.env.DB_HOST || 'mongodb'; -const DB_PORT = process.env.DB_PORT || 27017; -const DB_NAME = process.env.DB_NAME || 'auth'; - -export const connection = mongoose.connect(`${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}`); diff --git a/lib/server/server.ts b/lib/server/index.ts similarity index 60% rename from lib/server/server.ts rename to lib/server/index.ts index 2599b93..051a321 100644 --- a/lib/server/server.ts +++ b/lib/server/index.ts @@ -1,8 +1,8 @@ import dotenv from 'dotenv'; import app from './app'; -import { connection } from './database/database.connection'; -import { PORT } from '../constants/constants'; +import { connection } from '../db'; +import { PORT } from '../constants/env'; dotenv.config(); diff --git a/lib/server/middleware/authenication.ts b/lib/server/middleware/authenication.ts index 93a02da..a931d28 100644 --- a/lib/server/middleware/authenication.ts +++ b/lib/server/middleware/authenication.ts @@ -1,5 +1,5 @@ import { Middleware } from 'koa'; -import { LOGIN_ROUTE } from '../../constants/constants'; +import { LOGIN_ROUTE } from '../../constants/env'; export const authenticated = (): Middleware => { return (ctx, next) => { diff --git a/lib/server/passport/index.ts b/lib/server/passport/index.ts index 38bc8c9..74d077e 100644 --- a/lib/server/passport/index.ts +++ b/lib/server/passport/index.ts @@ -1,6 +1,6 @@ import passport from 'koa-passport'; -import Auth from '../../model/auth'; +import Auth from '../../db/model/auth'; import { Auth as AuthRecord } from '../../db/schema/auth'; import LocalStrategy from './strategies/local'; import JwtStrategy from './strategies/jwt'; diff --git a/lib/server/passport/strategies/jwt.ts b/lib/server/passport/strategies/jwt.ts index 6adefc1..90c4d68 100644 --- a/lib/server/passport/strategies/jwt.ts +++ b/lib/server/passport/strategies/jwt.ts @@ -1,12 +1,12 @@ // eslint-disable-next-line import/named import { ExtractJwt, Strategy as JwtStrategy } from 'passport-jwt'; -import Auth from '../../../model/auth'; -import { getJwtSecret } from '../../../utils/jwt'; +import Auth from '../../../db/model/auth'; +import { JWT_SECRET } from '../../../constants/env'; const opts = { jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), - secretOrKey: getJwtSecret(), + secretOrKey: JWT_SECRET, issuer: process.env.JWT_ISSUER, audience: process.env.JWT_AUDIENCE, }; diff --git a/lib/server/passport/strategies/local.ts b/lib/server/passport/strategies/local.ts index 9d8c969..4ffd155 100644 --- a/lib/server/passport/strategies/local.ts +++ b/lib/server/passport/strategies/local.ts @@ -1,7 +1,7 @@ // eslint-disable-next-line import/named import { Strategy as LocalStrategy } from 'passport-local'; -import Auth from '../../../model/auth'; +import Auth from '../../../db/model/auth'; export default new LocalStrategy(async (username: string, password: string, done: any) => { const user = await Auth.findOne({ diff --git a/lib/utils/jwt.ts b/lib/utils/jwt.ts index d4c4ee5..b6a9a51 100644 --- a/lib/utils/jwt.ts +++ b/lib/utils/jwt.ts @@ -1,5 +1,5 @@ import jwt from 'jsonwebtoken'; -import { JWT_AUDIENCE, JWT_ISSUER, JWT_SECRET } from '../constants/constants'; +import { JWT_AUDIENCE, JWT_ISSUER, JWT_SECRET } from '../constants/env'; export interface TokenProps { aud?: string; exp?: number | Date; diff --git a/lib/utils/links.ts b/lib/utils/links.ts index 01e87a7..72222a0 100644 --- a/lib/utils/links.ts +++ b/lib/utils/links.ts @@ -1,3 +1,3 @@ -import { RESET_ROUTE, ROUTE_PREFIX } from '../constants/constants'; +import { RESET_ROUTE, ROUTE_PREFIX } from '../constants/env'; export const getPasswordResetPath = (token: string) => `${ROUTE_PREFIX}${RESET_ROUTE}?t=${token}`; diff --git a/lib/utils/tokens.ts b/lib/utils/tokens.ts index c5446b3..5d146c2 100644 --- a/lib/utils/tokens.ts +++ b/lib/utils/tokens.ts @@ -1,7 +1,7 @@ import crypto from 'crypto'; import { sign } from './jwt'; -import { LOGIN_VALID_TIME, RESET_VALID_MINUTES } from '../constants/constants'; +import { LOGIN_VALID_TIME, RESET_VALID_MINUTES } from '../constants/env'; import { Status } from '../constants/auth'; const parseLoginValid = () => { @@ -14,12 +14,12 @@ const parseLoginValid = () => { }; export const generateLoginToken = (sub: string, status: Status) => { - const [days, hours, mins] = parseLoginValid(); - return sign({ - sub, - status, - exp: Date.now() + days * hours * mins * 60 * 1000, - }); + const [days, hours, mins] = parseLoginValid(); + return sign({ + sub, + status, + exp: Date.now() + days * hours * mins * 60 * 1000, + }); }; export const generateResetToken = (sub: string) => { diff --git a/package.json b/package.json index c19d7e7..63a2303 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "lint:fix": "eslint --fix --ext .ts,.tsx lib/", "prettier": "prettier --check 'lib/**/*.ts'", "prettier:fix": "prettier --write 'lib/**/*.ts'", - "serve": "ts-node src/server.ts", + "serve": "node dist/lib/server/index.js", "start": "nodemon", "test": "jest --passWithNoTests" },