Skip to content

Commit 43680b1

Browse files
Fixed compile and test issues.
1 parent 6e7f3a4 commit 43680b1

11 files changed

Lines changed: 62 additions & 40 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
"dependencies": {
2626
"@auth0/auth0-spa-js": "^1.13.6",
2727
"@google-cloud/firestore": "^4.9.9",
28+
"@types/hashring": "^3.2.1",
2829
"@types/node-fetch": "^2.5.8",
2930
"body-parser": "^1.19.0",
3031
"fastify": "^3.5.1",

src/auth0.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@ async function verifyJwtFromAuth0(authHeader: string, getUserInfo: (token: strin
4343

4444
async function verifyJwt(request: MinimalRequest, userCache: Memcached, getUserInfo: (token: string) => Promise<string>, getUserRole: (userId: string) => Promise<string>) {
4545
let authHeader = !!request.headers && !!request.headers.authorization ? request.headers.authorization : "";
46-
let userData = await verifyJwtCached(authHeader, userCache);
47-
if(!userData) {
48-
userData = await verifyJwtFromAuth0(authHeader, getUserInfo, getUserRole)
49-
await userCache.add(authHeader, userData, {expires: LIFETIME_SECONDS});
46+
if (!authHeader) {
47+
return {userAppId: null, role: null, admin: false}
48+
} else {
49+
let userData = await verifyJwtCached(authHeader, userCache);
50+
if(!userData) {
51+
userData = await verifyJwtFromAuth0(authHeader, getUserInfo, getUserRole)
52+
await userCache.add(authHeader, userData, {expires: LIFETIME_SECONDS});
53+
}
54+
return userData;
5055
}
51-
return userData;
5256
}

src/endpoints/businesses.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ export function createBusinessesEndpoint(app: FastifyInstance, dataLayer: DataLa
5656
{schema: getBizSchema},
5757
async (request , reply) => {
5858

59-
let {userAppId, admin} = await verifyJwt(request)
60-
if(!(admin || await isRegionManager(userAppId, request.params.regionId, dataLayer))) {
59+
let {userAppId, admin} = await verifyJwt(request);
60+
if (!(admin || await isRegionManager(userAppId, request.params.regionId, dataLayer))) {
6161
reply.unauthorized("User does not have access to region");
6262
return;
6363
} else {

src/endpoints/cache.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import {FastifyInstance} from "fastify";
22
import {Auth0JwtVerifier} from "../auth0";
33
import {AuthenticatedRequest} from "./endpointUtils";
44
import {emptyCacheSchema} from "./docs/cacheSchemas";
5-
import {Client} from "memjs";
5+
import {Memcached} from "memcached-node";
66

7-
export function createCacheEndpoint(app: FastifyInstance, verifyJwt: Auth0JwtVerifier, cache: Client) {
7+
export function createCacheEndpoint(app: FastifyInstance, verifyJwt: Auth0JwtVerifier, cache: Memcached) {
88
app.post<AuthenticatedRequest>(
99
"/cache/empty",
1010
{schema: emptyCacheSchema},
@@ -14,7 +14,7 @@ export function createCacheEndpoint(app: FastifyInstance, verifyJwt: Auth0JwtVer
1414
reply.unauthorized("Must be logged in to use this endpoint");
1515
return;
1616
} else {
17-
await cache.flush();
17+
await cache.clean();
1818
return {
1919
status: "Cache emptied",
2020
date: Date.now()

src/endpoints/users.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {FastifyInstance} from "fastify";
2-
import {Auth0JwtVerifier, Auth0UserInfo, UserInfoPatch} from "../auth0";
3-
import {getAllUsers, getUserById, updateUser} from "../dependencies/auth0Api"
2+
import {Auth0JwtVerifier} from "../auth0";
3+
import {Auth0UserInfo, getAllUsers, getUserById, updateUser, UserInfoPatch} from "../dependencies/auth0Api"
44
import {AuthenticatedRequest, AuthenticatedRequestById} from "./endpointUtils";
55
import {getAllUsersRequestSchema, getUserInfoRequestSchema, updateUserRequestSchema} from "./docs/userSchema";
66

src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import fastify, {FastifyInstance} from 'fastify';
22
import fastifySensible from "fastify-sensible";
3-
import MemcachePlus from "memcache-plus";
43

54
import createPingEndpoint from './endpoints/ping';
65
import { addRoutes } from './utils';
@@ -15,6 +14,7 @@ import {createEditEndpoint} from "./endpoints/editRequest";
1514
import {productionFirestore} from "./database/firestore";
1615
import createUsersEndpoint from "./endpoints/users";
1716
import {createCacheEndpoint} from "./endpoints/cache";
17+
import {Memcached} from "memcached-node";
1818

1919
let productionDataLayer = new ProductionDataLayer(productionFirestore)
2020
const port = Number(process.env.PORT || 8080);
@@ -23,7 +23,7 @@ server.register(fastifySensible);
2323
registerSwagger(server);
2424
registerCorsHandler(server);
2525

26-
let productionCache = new MemcachePlus();
26+
let productionCache = new Memcached("127.0.0.1:11211");
2727
let prodJwtVerifier = getJwtVerifier(productionCache);
2828
addRoutes(
2929
server,

tests/auth0.test.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1+
import fastify, {FastifyInstance} from "fastify";
2+
import fastifySensible from "fastify-sensible";
3+
import {Memcached, ResponseCode} from "memcached-node";
4+
import {IMock, It, Mock, Times} from "typemoq"
5+
16
import {addRoutes} from "../src/utils";
27
import createRegionsEndpoint from "../src/endpoints/regions";
38
import {DummyDatalayer} from "./testUtils/testDataLayer";
49
import {createBusinessesEndpoint} from "../src/endpoints/businesses";
5-
import fastifySensible from "fastify-sensible";
6-
import {authenticateToTestDomain, setupAuth0TestEnv} from "./testUtils/testify";
10+
import {authenticateToTestDomain, getEmptyCacheJwtVerifier, setupAuth0TestEnv} from "./testUtils/testify";
711
import {DummyRegion} from "./testUtils/dummyData";
812
import {DataLayer} from "../src/database/productionDataLayer";
913
import {Auth0JwtVerifier, getJwtVerifier, LIFETIME_SECONDS} from "../src/auth0";
10-
11-
import fastify, {FastifyInstance} from "fastify";
12-
import {IMock, It, Mock, Times} from "typemoq"
13-
import {Memcached, ResponseCode} from "memcached-node";
1414
import {getUserIdFromAuth0} from "../src/dependencies/auth0Api";
1515

16+
1617
describe("Auth0 unit tests", () => {
1718
const TEST_AUTH_HEADER = "Test";
1819
const TEST_USER_ID = "testUser";
@@ -37,17 +38,17 @@ describe("Auth0 unit tests", () => {
3738

3839
it("Pulls cached credentials first", async () => {
3940
mockCache.setup(c => c.get(It.isAnyString()))
40-
.returns((_: string) => Promise.resolve(
41-
{
41+
.returns((_: string) =>
42+
Promise.resolve({
4243
code: ResponseCode.EXISTS,
4344
data: {
4445
[TEST_AUTH_HEADER]: {
4546
key: TEST_AUTH_HEADER,
4647
value: JSON.stringify(testData)
4748
}
4849
}
49-
}
50-
));
50+
})
51+
);
5152
mockIdGetter.setup(g => g(It.isAnyString())).returns(_ => Promise.resolve(TEST_AUTH0_ID));
5253
mockRoleGetter.setup(g => g(It.isAnyString())).returns(_ => Promise.resolve(TEST_ROLE));
5354

@@ -101,9 +102,7 @@ describe("Auth0 integration tests", () => {
101102
describe("Region Tests", () => {
102103
let verifyJwt: Auth0JwtVerifier;
103104
beforeEach(() => {
104-
let dummyCache = Mock.ofType(Memcached);
105-
dummyCache.setup(c => c.get(It.isAnyString())).returns(_ => Promise.resolve({code: ResponseCode.NOT_FOUND}));
106-
verifyJwt = getJwtVerifier(dummyCache.object);
105+
verifyJwt = getEmptyCacheJwtVerifier();
107106
addRoutes(
108107
sut,
109108
() => createRegionsEndpoint(sut, new DummyDatalayer(), verifyJwt)
@@ -144,9 +143,7 @@ describe("Auth0 integration tests", () => {
144143
let testDataLayer: DataLayer;
145144
let verifyJwt: Auth0JwtVerifier;
146145
beforeEach(() => {
147-
let dummyCache = Mock.ofType(Memcached);
148-
dummyCache.setup(c => c.get(It.isAnyString())).returns(_ => Promise.resolve({code: ResponseCode.NOT_FOUND}))
149-
verifyJwt = getJwtVerifier(dummyCache.object);
146+
verifyJwt = getEmptyCacheJwtVerifier();
150147
testDataLayer = new DummyDatalayer();
151148
addRoutes(sut,
152149
() => createBusinessesEndpoint(sut, testDataLayer, verifyJwt),

tests/testUtils/dummyData.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import {FastifyInstance, FastifyRequest} from "fastify";
1+
import {FastifyInstance} from "fastify";
22
import {Business, BusinessUpdate} from "../../src/endpoints/businesses";
33
import {Region} from "../../src/database/productionDataLayer";
44
import {getMockToken} from "./testify";
5+
import {MinimalRequest} from "../../src/auth0";
56

67
const dummyManager = "DummyManagerId";
78
export const dummyAdminId = "admin";
@@ -30,8 +31,8 @@ export const DummyBizUpdate: BusinessUpdate = {
3031
};
3132

3233

33-
export async function dummyTokenVerifier (req: FastifyRequest) {
34-
if(!req.headers.authorization || !req.headers.authorization.split("Bearer")[1].trim()) {
34+
export async function dummyTokenVerifier (req: MinimalRequest) {
35+
if(!req.headers || !req.headers.authorization || !req.headers.authorization.split("Bearer")[1].trim()) {
3536
return {userAppId: "", admin: false, role: ""};
3637
}
3738
if(req.headers.authorization.indexOf(dummyAdminToken) > 0) {

tests/testUtils/testify.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import fastify, {FastifyRequest} from "fastify";
1+
import fastify from "fastify";
22
import fastifyJWT, {FastifyJWTOptions} from "fastify-jwt";
33
import jwt from "jsonwebtoken";
44
import fastifySensible from "fastify-sensible";
55
import fetch from "node-fetch";
6+
import {It, Mock} from "typemoq";
7+
import {Memcached, ResponseCode} from "memcached-node";
8+
9+
import {getJwtVerifier, MinimalRequest} from "../../src/auth0";
610

711
export const AUTH0_CLAIMS_NAMESPACE = "https://mun.ca";
812
export const mockSecret = 'dummy';
@@ -61,9 +65,18 @@ export function getMockToken(payload: {userAppId: string, admin: boolean }) {
6165
}
6266

6367
export function getTestJwtVerifier(userAppId: string, admin: boolean) {
64-
return async(_: FastifyRequest) => ({userAppId, admin, role: admin ? "admin" : "region" });
68+
return async(_: MinimalRequest) => ({userAppId, admin, role: admin ? "admin" : "region" });
6569
}
6670

71+
72+
export function getEmptyCacheJwtVerifier() {
73+
let cachePrototype = new Memcached("127.0.0.1:11211");
74+
let dummyCache = Mock.ofInstance(cachePrototype);
75+
dummyCache.setup(c => c.get(It.isAnyString())).returns(_ => Promise.resolve({code: ResponseCode.NOT_FOUND}));
76+
return getJwtVerifier(dummyCache.object);
77+
}
78+
79+
6780
export const testify = () => {
6881
const f = fastify({logger: {level: "debug"}});
6982
f.register(fastifyJWT, <FastifyJWTOptions>{

tests/users.test.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import {authenticateToTestDomain, setupAuth0TestEnv, testify} from "./testUtils/testify";
1+
import {authenticateToTestDomain, getEmptyCacheJwtVerifier, setupAuth0TestEnv, testify} from "./testUtils/testify";
22
import createUsersEndpoint from "../src/endpoints/users";
3-
import { verifyJwt } from "../src/auth0";
43

54
describe("Auth0 user endpoint tests", () => {
65
let userAccessToken: string;
@@ -15,7 +14,7 @@ describe("Auth0 user endpoint tests", () => {
1514
});
1615
}
1716
let server = testify();
18-
let userApp = createUsersEndpoint(server, verifyJwt, cache);
17+
let userApp = createUsersEndpoint(server, getEmptyCacheJwtVerifier());
1918
setupAuth0TestEnv();
2019
let authTokens = await authenticateToTestDomain();
2120
userAccessToken = authTokens.userAccessToken;
@@ -46,7 +45,7 @@ describe("Auth0 user endpoint tests", () => {
4645
});
4746
}
4847
let server = testify();
49-
let userApp = createUsersEndpoint(server, verifyJwt);
48+
let userApp = createUsersEndpoint(server, getEmptyCacheJwtVerifier());
5049
setupAuth0TestEnv();
5150
let authTokens = await authenticateToTestDomain();
5251
userAccessToken = authTokens.userAccessToken;
@@ -76,7 +75,7 @@ describe("Auth0 user endpoint tests", () => {
7675
});
7776
}
7877
let server = testify();
79-
let userApp = createUsersEndpoint(server, verifyJwt);
78+
let userApp = createUsersEndpoint(server, getEmptyCacheJwtVerifier());
8079
setupAuth0TestEnv();
8180
let authTokens = await authenticateToTestDomain();
8281
userAccessToken = authTokens.userAccessToken;

0 commit comments

Comments
 (0)