Compare commits

...

2 Commits

Author SHA1 Message Date
710b8a8e8a Working! 2023-06-01 00:08:28 -04:00
a0e30f95c3 Gatekeeper! Better 2023-05-30 20:22:12 -04:00
12 changed files with 209 additions and 74 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "@mifi/auth-gatekeeper",
"version": "1.0.0",
"version": "1.0.12",
"author": "mifi (Mike Fitzpatrick)",
"license": "MIT",
"scripts": {
@@ -47,7 +47,8 @@
},
"packageManager": "yarn@3.5.1",
"dependencies": {
"@mifi/services-common": "^1.0.8",
"@mifi/auth-common": "^1.0.15",
"@mifi/services-common": "^1.0.16",
"http-status-codes": "^2.2.0",
"jsonwebtoken": "^9.0.0"
}

View File

@@ -1,10 +0,0 @@
export const PACKAGE_NAME = '@mifi/auth-gatekeeper';
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_TIMEOUT = process.env.LOGIN_VALID_TIMEOUT || '12h'; // ###d|h|m
export const RESET_VALID_TIMEOUT = process.env.RESET_VALID_TIMEOUT || '15m'; // ###d|h|m
export const VERIFY_VALID_TIMEOUT = process.env.VERIFY_VALID_TIMEOUT || '60d'; // ###d|h|m
export const DEFAULT_TOKEN_DAYS = process.env.DEFAULT_TOKEN_DAYS || 365;

View File

@@ -4,6 +4,7 @@ import { Middleware } from 'koa';
import { initialize } from './middleware/initialize';
import { Strategy as StrategyBase, VerifyFunction } from './strategy';
import { authenticated } from './middleware/authenticated';
import { jwt } from './middleware/jwt';
class Gatekeeper {
private static instance: Gatekeeper;
@@ -22,9 +23,7 @@ class Gatekeeper {
}
};
public static authenticated = authenticated;
public initialize = initialize;
public authenticated = authenticated;
public static getInstance = () => {
if (!Gatekeeper.instance) {
@@ -33,6 +32,10 @@ class Gatekeeper {
return Gatekeeper.instance;
};
public initialize = initialize;
public jwt = jwt;
public use = (strategy: StrategyBase) => {
this.strategies[<string>strategy.name] = strategy.verify;
};
@@ -40,4 +43,4 @@ class Gatekeeper {
export const gatekeeper = Gatekeeper.getInstance();
export const Strategy = StrategyBase;
export const Strategy: typeof StrategyBase = StrategyBase;

View File

@@ -1,6 +1,6 @@
import { Middleware } from 'koa';
import { LOGIN_ROUTE } from '../../constants/env';
import { LOGIN_ROUTE } from '@mifi/auth-common/lib/env/routes';
export const authenticated: Middleware = async (ctx, next) => {
if (ctx?.isAuthenticated()) {

View File

@@ -1,5 +1,6 @@
import { Middleware } from 'koa';
import { GatekeeperUser } from './types/GatekeeperUser';
import { Context, Middleware } from 'koa';
import { GatekeeperUser } from '../types/GatekeeperUser';
declare module 'koa' {
interface ExtendableContext {
@@ -10,9 +11,21 @@ declare module 'koa' {
}
}
const isAuthenticated = function (this: Context) {
return !!this.user;
};
const isUnauthenticated = function (this: Context) {
return !this.user;
};
const logout = function (this: Context) {
this.user = null;
};
export const initialize: Middleware = (ctx) => {
ctx.user = null;
ctx.isAuthenticated = () => !!ctx.user;
ctx.isUnauthenticated = () => !ctx.user;
ctx.logout = () => (ctx.user = null);
ctx.isAuthenticated = isAuthenticated.bind(ctx);
ctx.isUnauthenticated = isUnauthenticated.bind(ctx);
ctx.logout = logout.bind(ctx);
};

View File

@@ -1,6 +1,7 @@
import { Middleware } from 'koa';
import { verify } from '../utils/jwt';
import { verify } from '@mifi/auth-common/lib/utils/jwt/verify';
import { GatekeeperUser } from '../types/GatekeeperUser';
export const jwt: Middleware = (ctx) => {

View File

@@ -1,5 +1,5 @@
import { Middleware } from 'koa';
import { GatekeeperUser } from './types/GatekeeperUser';
import { GatekeeperUser } from '../types/GatekeeperUser';
type Fn<P, T> = (u: P) => T;

View File

@@ -1,6 +1,7 @@
import { Context } from 'koa';
import { STRATEGIES } from '../../constants/strategies';
import { STRATEGIES } from '@mifi/auth-common/lib/enums/strategies';
import { GatekeeperUser } from './types/GatekeeperUser';
export type VerifyFunction = (ctx: Context) => Promise<GatekeeperUser | false>;

View File

@@ -1,4 +0,0 @@
import { sign } from './sign';
import { verify } from './verify';
export { sign, verify };

View File

@@ -1,35 +0,0 @@
import { sign as jwtSign } from 'jsonwebtoken';
import { JWT_AUDIENCE, JWT_ISSUER, JWT_SECRET } from '../../constants/env';
import { Payload } from '@mifi/services-common/lib/types/Payload';
export type TokenProps = Payload & {
aud?: string;
exp?: number;
iss?: string;
sub: string | null;
};
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) {
const defaultExp = new Date(today);
defaultExp.setDate(today.getDate() + parseInt(process.env.JWT_DAYS_VALID as string));
exp = defaultExp.getTime() / 1000;
}
return jwtSign(
{
exp,
sub,
aud: rest.aud || JWT_AUDIENCE,
iat: today.getTime(),
iss: rest.iss || JWT_ISSUER,
},
JWT_SECRET,
);
};

View File

@@ -1,4 +0,0 @@
import { verify as jwtVerify } from 'jsonwebtoken';
import { JWT_SECRET } from '../../constants/env';
export const verify = (token: string) => jwtVerify(token, JWT_SECRET);

181
yarn.lock
View File

@@ -1846,6 +1846,17 @@ __metadata:
languageName: node
linkType: hard
"@mifi/auth-common@npm:^1.0.15":
version: 1.0.15
resolution: "@mifi/auth-common@npm:1.0.15::__archiveUrl=https%3A%2F%2Fgit.mifi.dev%2Fapi%2Fpackages%2Fmifi%2Fnpm%2F%2540mifi%252Fauth-common%2F-%2F1.0.15%2Fauth-common-1.0.15.tgz"
dependencies:
"@mifi/breakerbox-db": ^1.0.13
"@mifi/services-common": ^1.0.16
jsonwebtoken: ^9.0.0
checksum: 63931f45a18871362e16e0affc95d16ece4f0a4e6cf05d99146063115fc51d62cf75f262cfad661d76ec4a47f6e5ee32742fe840fb466cb4905829f67999d974
languageName: node
linkType: hard
"@mifi/auth-gatekeeper@workspace:.":
version: 0.0.0-use.local
resolution: "@mifi/auth-gatekeeper@workspace:."
@@ -1853,7 +1864,8 @@ __metadata:
"@babel/core": ^7.21.8
"@babel/preset-env": ^7.21.5
"@babel/preset-typescript": ^7.21.5
"@mifi/services-common": ^1.0.8
"@mifi/auth-common": ^1.0.15
"@mifi/services-common": ^1.0.16
"@tsconfig/node16": ^1.0.4
"@types/jest": ^29.5.1
"@types/jsonwebtoken": ^9.0.2
@@ -1881,10 +1893,20 @@ __metadata:
languageName: unknown
linkType: soft
"@mifi/services-common@npm:^1.0.8":
version: 1.0.8
resolution: "@mifi/services-common@npm:1.0.8::__archiveUrl=https%3A%2F%2Fgit.mifi.dev%2Fapi%2Fpackages%2Fmifi%2Fnpm%2F%2540mifi%252Fservices-common%2F-%2F1.0.8%2Fservices-common-1.0.8.tgz"
checksum: e7bb930ec2314505c16617a554124bdf60b1cc70116b0903cbf5bfb3886ddd3bd64b002c59cbd6a39c7743b68351255d2a73fab1093c91757bad39cb47ef34bf
"@mifi/breakerbox-db@npm:^1.0.13":
version: 1.0.13
resolution: "@mifi/breakerbox-db@npm:1.0.13::__archiveUrl=https%3A%2F%2Fgit.mifi.dev%2Fapi%2Fpackages%2Fmifi%2Fnpm%2F%2540mifi%252Fbreakerbox-db%2F-%2F1.0.13%2Fbreakerbox-db-1.0.13.tgz"
dependencies:
level: ^8.0.0
yaml: ^2.3.1
checksum: 57d431249b2b20387faea8e99546ff67b60b543636d1bf80479e9443f1bda71364cb890ef1d2c8d6cf28623c2b208e68c44076a03c4080417c0b072188362b9c
languageName: node
linkType: hard
"@mifi/services-common@npm:^1.0.16":
version: 1.0.16
resolution: "@mifi/services-common@npm:1.0.16::__archiveUrl=https%3A%2F%2Fgit.mifi.dev%2Fapi%2Fpackages%2Fmifi%2Fnpm%2F%2540mifi%252Fservices-common%2F-%2F1.0.16%2Fservices-common-1.0.16.tgz"
checksum: 9ef5aae54cfdc21b2f1ee78366767890d0fbda0d2459783ffba0af239a7a7a27e52dc2cb2dc82318763a5ecc8ec1bac0570a79f0973b620bd8a5c911a65768bc
languageName: node
linkType: hard
@@ -2493,6 +2515,21 @@ __metadata:
languageName: node
linkType: hard
"abstract-level@npm:^1.0.2":
version: 1.0.3
resolution: "abstract-level@npm:1.0.3"
dependencies:
buffer: ^6.0.3
catering: ^2.1.0
is-buffer: ^2.0.5
level-supports: ^4.0.0
level-transcoder: ^1.0.1
module-error: ^1.0.1
queue-microtask: ^1.2.3
checksum: 70d61a3924526ebc257b138992052f9ff571a6cee5a7660836e37a1cc7081273c3acf465dd2f5e1897b38dc743a6fd9dba14a5d8a2a9d39e5787cd3da99f301d
languageName: node
linkType: hard
"accepts@npm:^1.3.5":
version: 1.3.8
resolution: "accepts@npm:1.3.8"
@@ -2876,6 +2913,13 @@ __metadata:
languageName: node
linkType: hard
"base64-js@npm:^1.3.1":
version: 1.5.1
resolution: "base64-js@npm:1.5.1"
checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005
languageName: node
linkType: hard
"big-integer@npm:^1.6.44":
version: 1.6.51
resolution: "big-integer@npm:1.6.51"
@@ -2927,6 +2971,18 @@ __metadata:
languageName: node
linkType: hard
"browser-level@npm:^1.0.1":
version: 1.0.1
resolution: "browser-level@npm:1.0.1"
dependencies:
abstract-level: ^1.0.2
catering: ^2.1.1
module-error: ^1.0.2
run-parallel-limit: ^1.1.0
checksum: 67fbc77ce832940bfa25073eccff279f512ad56f545deb996a5b23b02316f5e76f4a79d381acc27eda983f5c9a2566aaf9c97e4fdd0748288c4407307537a29b
languageName: node
linkType: hard
"browserslist@npm:^4.21.3, browserslist@npm:^4.21.5":
version: 4.21.7
resolution: "browserslist@npm:4.21.7"
@@ -2964,6 +3020,16 @@ __metadata:
languageName: node
linkType: hard
"buffer@npm:^6.0.3":
version: 6.0.3
resolution: "buffer@npm:6.0.3"
dependencies:
base64-js: ^1.3.1
ieee754: ^1.2.1
checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9
languageName: node
linkType: hard
"builtins@npm:^5.0.1":
version: 5.0.1
resolution: "builtins@npm:5.0.1"
@@ -3068,6 +3134,13 @@ __metadata:
languageName: node
linkType: hard
"catering@npm:^2.1.0, catering@npm:^2.1.1":
version: 2.1.1
resolution: "catering@npm:2.1.1"
checksum: 205daefa69c935b0c19f3d8f2e0a520dd69aebe9bda55902958003f7c9cff8f967dfb90071b421bd6eb618576f657a89d2bc0986872c9bc04bbd66655e9d4bd6
languageName: node
linkType: hard
"chalk@npm:^1.1.3":
version: 1.1.3
resolution: "chalk@npm:1.1.3"
@@ -3130,6 +3203,20 @@ __metadata:
languageName: node
linkType: hard
"classic-level@npm:^1.2.0":
version: 1.3.0
resolution: "classic-level@npm:1.3.0"
dependencies:
abstract-level: ^1.0.2
catering: ^2.1.0
module-error: ^1.0.1
napi-macros: ^2.2.2
node-gyp: latest
node-gyp-build: ^4.3.0
checksum: 773da48aef52a041115d413fee8340b357a4da2eb505764f327183b155edd7cc9d24819eb4f707c83dbdae8588024f5dddeb322125567c59d5d1f6f16334cdb9
languageName: node
linkType: hard
"clean-stack@npm:^2.0.0":
version: 2.2.0
resolution: "clean-stack@npm:2.2.0"
@@ -4628,6 +4715,13 @@ __metadata:
languageName: node
linkType: hard
"ieee754@npm:^1.2.1":
version: 1.2.1
resolution: "ieee754@npm:1.2.1"
checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e
languageName: node
linkType: hard
"ignore@npm:^5.1.1, ignore@npm:^5.2.0":
version: 5.2.4
resolution: "ignore@npm:5.2.4"
@@ -4750,6 +4844,13 @@ __metadata:
languageName: node
linkType: hard
"is-buffer@npm:^2.0.5":
version: 2.0.5
resolution: "is-buffer@npm:2.0.5"
checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42
languageName: node
linkType: hard
"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7":
version: 1.2.7
resolution: "is-callable@npm:1.2.7"
@@ -5656,6 +5757,33 @@ __metadata:
languageName: node
linkType: hard
"level-supports@npm:^4.0.0":
version: 4.0.1
resolution: "level-supports@npm:4.0.1"
checksum: d4552b42bb8cdeada07b0f6356c7a90fefe76279147331f291aceae26e3e56d5f927b09ce921647c0230bfe03ddfbdcef332be921e5c2194421ae2bfa3cf6368
languageName: node
linkType: hard
"level-transcoder@npm:^1.0.1":
version: 1.0.1
resolution: "level-transcoder@npm:1.0.1"
dependencies:
buffer: ^6.0.3
module-error: ^1.0.1
checksum: 304f08d802faf3491a533b6d87ad8be3cabfd27f2713bbe9d4c633bf50fcb9460eab5a6776bf015e101ead7ba1c1853e05e7f341112f17a9d0cb37ee5a421a25
languageName: node
linkType: hard
"level@npm:^8.0.0":
version: 8.0.0
resolution: "level@npm:8.0.0"
dependencies:
browser-level: ^1.0.1
classic-level: ^1.2.0
checksum: 13eb25bd71bfdca6cd714d1233adf9da97de9a8a4bf9f28d62a390b5c96d0250abaf983eb90eb8c4e89c7a985bb330750683d106f12670e5ea8fba1d7e608a1f
languageName: node
linkType: hard
"leven@npm:^3.1.0":
version: 3.1.0
resolution: "leven@npm:3.1.0"
@@ -6013,6 +6141,13 @@ __metadata:
languageName: node
linkType: hard
"module-error@npm:^1.0.1, module-error@npm:^1.0.2":
version: 1.0.2
resolution: "module-error@npm:1.0.2"
checksum: 5d653e35bd55b3e95f8aee2cdac108082ea892e71b8f651be92cde43e4ee86abee4fa8bd7fc3fe5e68b63926d42f63c54cd17b87a560c31f18739295575a3962
languageName: node
linkType: hard
"moo@npm:^0.5.1":
version: 0.5.2
resolution: "moo@npm:0.5.2"
@@ -6034,6 +6169,13 @@ __metadata:
languageName: node
linkType: hard
"napi-macros@npm:^2.2.2":
version: 2.2.2
resolution: "napi-macros@npm:2.2.2"
checksum: c6f9bd71cdbbc37ddc3535aa5be481238641d89585b8a3f4d301cb89abf459e2d294810432bb7d12056d1f9350b1a0899a5afcf460237a3da6c398cf0fec7629
languageName: node
linkType: hard
"natural-compare-lite@npm:^1.4.0":
version: 1.4.0
resolution: "natural-compare-lite@npm:1.4.0"
@@ -6055,6 +6197,17 @@ __metadata:
languageName: node
linkType: hard
"node-gyp-build@npm:^4.3.0":
version: 4.6.0
resolution: "node-gyp-build@npm:4.6.0"
bin:
node-gyp-build: bin.js
node-gyp-build-optional: optional.js
node-gyp-build-test: build-test.js
checksum: 25d78c5ef1f8c24291f4a370c47ba52fcea14f39272041a90a7894cd50d766f7c8cb8fb06c0f42bf6f69b204b49d9be3c8fc344aac09714d5bdb95965499eb15
languageName: node
linkType: hard
"node-gyp@npm:latest":
version: 9.3.1
resolution: "node-gyp@npm:9.3.1"
@@ -6531,7 +6684,7 @@ __metadata:
languageName: node
linkType: hard
"queue-microtask@npm:^1.2.2":
"queue-microtask@npm:^1.2.2, queue-microtask@npm:^1.2.3":
version: 1.2.3
resolution: "queue-microtask@npm:1.2.3"
checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4
@@ -6756,6 +6909,15 @@ __metadata:
languageName: node
linkType: hard
"run-parallel-limit@npm:^1.1.0":
version: 1.1.0
resolution: "run-parallel-limit@npm:1.1.0"
dependencies:
queue-microtask: ^1.2.2
checksum: 672c3b87e7f939c684b9965222b361421db0930223ed1e43ebf0e7e48ccc1a022ea4de080bef4d5468434e2577c33b7681e3f03b7593fdc49ad250a55381123c
languageName: node
linkType: hard
"run-parallel@npm:^1.1.9":
version: 1.2.0
resolution: "run-parallel@npm:1.2.0"
@@ -7672,6 +7834,13 @@ __metadata:
languageName: node
linkType: hard
"yaml@npm:^2.3.1":
version: 2.3.1
resolution: "yaml@npm:2.3.1"
checksum: 2c7bc9a7cd4c9f40d3b0b0a98e370781b68b8b7c4515720869aced2b00d92f5da1762b4ffa947f9e795d6cd6b19f410bd4d15fdd38aca7bd96df59bd9486fb54
languageName: node
linkType: hard
"yargs-parser@npm:^13.1.2":
version: 13.1.2
resolution: "yargs-parser@npm:13.1.2"