Skip to content

Commit 435c939

Browse files
authored
Added a re-usable function for Auth (#199)
1 parent f536326 commit 435c939

10 files changed

+62
-52
lines changed

src/controllers/changeNickname.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { IRequest } from "itty-router";
22
import { env } from "../typeDefinitions/default.types";
33
import JSONResponse from "../utils/JsonResponse";
44
import * as response from "../constants/responses";
5-
import { verifyAuthToken } from "../utils/verifyAuthToken";
5+
import { verifyNodejsBackendAuthToken } from "../utils/verifyAuthToken";
66
import { updateNickName } from "../utils/updateNickname";
77

88
export async function changeNickname(request: IRequest, env: env) {
@@ -14,7 +14,7 @@ export async function changeNickname(request: IRequest, env: env) {
1414
}
1515

1616
try {
17-
await verifyAuthToken(authHeader, env);
17+
await verifyNodejsBackendAuthToken(authHeader, env);
1818
const { discordId, userName } = await request.json();
1919
const res = await updateNickName(discordId, userName, env, reason);
2020
return new JSONResponse(res);

src/controllers/generateDiscordInvite.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { IRequest } from "itty-router";
22
import * as response from "../constants/responses";
33
import { env } from "../typeDefinitions/default.types";
44
import JSONResponse from "../utils/JsonResponse";
5-
import { verifyAuthToken } from "../utils/verifyAuthToken";
5+
import { verifyNodejsBackendAuthToken } from "../utils/verifyAuthToken";
66
import { generateDiscordLink } from "../utils/generateDiscordInvite";
77
import { inviteLinkBody } from "../typeDefinitions/discordLink.types";
88

@@ -12,7 +12,7 @@ export async function generateInviteLink(request: IRequest, env: env) {
1212
return new JSONResponse(response.BAD_SIGNATURE);
1313
}
1414
try {
15-
await verifyAuthToken(authHeader, env);
15+
await verifyNodejsBackendAuthToken(authHeader, env);
1616
const reason = request.headers.get("X-Audit-Log-Reason");
1717

1818
const body: inviteLinkBody = await request.json();

src/controllers/getGuildMemberDetailsHandler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as response from "../constants/responses";
22
import { env } from "../typeDefinitions/default.types";
33
import JSONResponse from "../utils/JsonResponse";
44
import { IRequest } from "itty-router";
5-
import { verifyAuthToken } from "../utils/verifyAuthToken";
5+
import { verifyNodejsBackendAuthToken } from "../utils/verifyAuthToken";
66
import { getGuildMemberDetails } from "../utils/getGuildMemberDetails";
77

88
export async function getGuildMemberDetailsHandler(
@@ -14,7 +14,7 @@ export async function getGuildMemberDetailsHandler(
1414
return new JSONResponse(response.BAD_SIGNATURE);
1515
}
1616
try {
17-
await verifyAuthToken(authHeader, env);
17+
await verifyNodejsBackendAuthToken(authHeader, env);
1818

1919
const { id: discordId } = request.params;
2020

src/controllers/getMembersInServer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { env } from "../typeDefinitions/default.types";
55
import JSONResponse from "../utils/JsonResponse";
66
import { User } from "../typeDefinitions/user.types";
77
import { getMembersInServer } from "../utils/getMembersInServer";
8-
import { verifyAuthToken } from "../utils/verifyAuthToken";
8+
import { verifyNodejsBackendAuthToken } from "../utils/verifyAuthToken";
99

1010
export const getMembersInServerHandler = async (
1111
request: IRequest,
@@ -17,7 +17,7 @@ export const getMembersInServerHandler = async (
1717
return new JSONResponse(response.BAD_SIGNATURE);
1818
}
1919
try {
20-
await verifyAuthToken(authHeader, env);
20+
await verifyNodejsBackendAuthToken(authHeader, env);
2121

2222
const users = (await getMembersInServer(env)) as User[];
2323

src/controllers/guildRoleHandler.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ import {
1313
createNewRole,
1414
memberGroupRole,
1515
} from "../typeDefinitions/discordMessage.types";
16-
import { verifyAuthToken, verifyCronJobsToken } from "../utils/verifyAuthToken";
16+
import {
17+
verifyNodejsBackendAuthToken,
18+
verifyCronJobsToken,
19+
} from "../utils/verifyAuthToken";
1720
import { batchDiscordRequests } from "../utils/batchDiscordRequests";
1821
import { DISCORD_BASE_URL } from "../constants/urls";
1922
import { GROUP_ROLE_ADD } from "../constants/requestsActions";
@@ -25,7 +28,7 @@ export async function createGuildRoleHandler(request: IRequest, env: env) {
2528
return new JSONResponse(response.BAD_SIGNATURE);
2629
}
2730
try {
28-
await verifyAuthToken(authHeader, env);
31+
await verifyNodejsBackendAuthToken(authHeader, env);
2932
const body: createNewRole = await request.json();
3033
const reason = request.headers.get("X-Audit-Log-Reason");
3134
const res = await createGuildRole(body, env, reason);
@@ -40,7 +43,7 @@ export async function addGroupRoleHandler(request: IRequest, env: env) {
4043
return new JSONResponse(response.BAD_SIGNATURE);
4144
}
4245
try {
43-
await verifyAuthToken(authHeader, env);
46+
await verifyNodejsBackendAuthToken(authHeader, env);
4447
const body: memberGroupRole = await request.json();
4548
const reason = request.headers.get("X-Audit-Log-Reason");
4649

@@ -64,7 +67,7 @@ export async function getGuildRolesPostHandler(request: IRequest, env: env) {
6467
if (dev === "true") {
6568
await verifyCronJobsToken(authHeader, env);
6669
} else {
67-
await verifyAuthToken(authHeader, env);
70+
await verifyNodejsBackendAuthToken(authHeader, env);
6871
}
6972

7073
switch (action) {
@@ -161,7 +164,7 @@ export async function removeGuildRoleHandler(request: IRequest, env: env) {
161164
return new JSONResponse(response.BAD_SIGNATURE, { status: 401 });
162165
}
163166
try {
164-
await verifyAuthToken(authHeader, env);
167+
await verifyNodejsBackendAuthToken(authHeader, env);
165168
const body: memberGroupRole = await request.json();
166169
const res = await removeGuildRole(body, env, reason);
167170
return new JSONResponse(res, {
@@ -186,7 +189,7 @@ export async function getGuildRolesHandler(request: IRequest, env: env) {
186189
return new JSONResponse(response.BAD_SIGNATURE, { status: 401 });
187190
}
188191
try {
189-
await verifyAuthToken(authHeader, env);
192+
await verifyNodejsBackendAuthToken(authHeader, env);
190193
const roles = await getGuildRoles(env);
191194
return new JSONResponse({ roles });
192195
} catch (err: any) {
@@ -223,7 +226,7 @@ export async function getGuildRoleByRoleNameHandler(
223226
return new JSONResponse(response.BAD_REQUEST, { status: 404 });
224227
}
225228
try {
226-
await verifyAuthToken(authHeader, env);
229+
await verifyNodejsBackendAuthToken(authHeader, env);
227230
const role = await getGuildRoleByName(roleName, env);
228231
if (!role) {
229232
return new JSONResponse(response.NOT_FOUND, {

src/controllers/profileHandler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import { env } from "../typeDefinitions/default.types";
22
import { sendProfileServiceBlockedMessage } from "../utils/sendProfileServiceBlockedMessage";
33
import JSONResponse from "../utils/JsonResponse";
44
import * as response from "../constants/responses";
5-
import { verifyAuthToken } from "../utils/verifyAuthToken";
5+
import { verifyNodejsBackendAuthToken } from "../utils/verifyAuthToken";
66

77
export const sendProfileBlockedMessage = async (request: any, env: env) => {
88
const authHeader = request.headers.get("Authorization");
99
if (!authHeader) {
1010
return new JSONResponse(response.BAD_SIGNATURE);
1111
}
1212
try {
13-
await verifyAuthToken(authHeader, env);
13+
await verifyNodejsBackendAuthToken(authHeader, env);
1414
const messageRequest: { userId: string; reason: string } =
1515
await request.json();
1616
const { userId, reason } = messageRequest;

src/utils/verifyAuthToken.ts

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,16 @@ import {
55
import { env } from "../typeDefinitions/default.types";
66
import jwt from "@tsndr/cloudflare-worker-jwt";
77

8-
/**
9-
*
10-
* @param authHeader { string } : the auth header of request
11-
* @param env { env }: the ctx (context) which contains the secrets put in as wrangler secrets.
12-
*/
13-
14-
export async function verifyAuthToken(authHeader: string, env: env) {
8+
async function verifyAuthToken(authHeader: string, public_key: string) {
9+
if (!authHeader) {
10+
throw new Error(INVALID_TOKEN_FORMAT);
11+
}
1512
const parts = authHeader.split(" ");
1613
if (parts.length !== 2 || parts[0] !== "Bearer") {
1714
throw new Error(INVALID_TOKEN_FORMAT);
1815
}
1916
const authToken = parts[1];
20-
const isValid = await jwt.verify(authToken, env.RDS_SERVERLESS_PUBLIC_KEY, {
17+
const isValid = await jwt.verify(authToken, public_key, {
2118
algorithm: "RS256",
2219
});
2320
if (!isValid) {
@@ -30,19 +27,27 @@ export async function verifyAuthToken(authHeader: string, env: env) {
3027
* @param authHeader { string } : the auth header of request
3128
* @param env { env }: the ctx (context) which contains the secrets put in as wrangler secrets.
3229
*/
33-
export async function verifyCronJobsToken(authHeader: string, env: env) {
34-
if (!authHeader) {
35-
throw new Error(INVALID_TOKEN_FORMAT);
36-
}
37-
const authHeaderParts = authHeader.split(" ");
38-
if (authHeaderParts.length !== 2 || authHeaderParts[0] !== "Bearer") {
39-
throw new Error(INVALID_TOKEN_FORMAT);
30+
31+
export async function verifyNodejsBackendAuthToken(
32+
authHeader: string,
33+
env: env
34+
) {
35+
try {
36+
await verifyAuthToken(authHeader, env.RDS_SERVERLESS_PUBLIC_KEY);
37+
} catch (err: any) {
38+
throw new Error(err.message);
4039
}
41-
const authToken = authHeaderParts[1];
42-
const isValid = await jwt.verify(authToken, env.CRON_JOBS_PUBLIC_KEY, {
43-
algorithm: "RS256",
44-
});
45-
if (!isValid) {
46-
throw new Error(AUTHENTICATION_ERROR);
40+
}
41+
42+
/**
43+
*
44+
* @param authHeader { string } : the auth header of request
45+
* @param env { env }: the ctx (context) which contains the secrets put in as wrangler secrets.
46+
*/
47+
export async function verifyCronJobsToken(authHeader: string, env: env) {
48+
try {
49+
await verifyAuthToken(authHeader, env.CRON_JOBS_PUBLIC_KEY);
50+
} catch (err: any) {
51+
throw new Error(err.message);
4752
}
4853
}

tests/unit/handlers/generateDiscordInvite.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import * as responseConstants from "../../../src/constants/responses";
1111
import { inviteResponseType } from "../../../src/typeDefinitions/discordLink.types";
1212

1313
jest.mock("../../../src/utils/verifyAuthToken", () => ({
14-
verifyAuthToken: jest.fn().mockReturnValue(true),
14+
verifyNodejsBackendAuthToken: jest.fn().mockReturnValue(true),
1515
}));
1616

1717
describe("generate discord link", () => {

tests/unit/handlers/guildRoleHandler.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import * as guildRoleUtils from "../../../src/utils/guildRole";
1717
import { GROUP_ROLE_ADD } from "../../../src/constants/requestsActions";
1818

1919
jest.mock("../../../src/utils/verifyAuthToken", () => ({
20-
verifyAuthToken: jest.fn().mockReturnValue(true),
20+
verifyNodejsBackendAuthToken: jest.fn().mockReturnValue(true),
2121
verifyCronJobsToken: jest.fn().mockReturnValue(true),
2222
}));
2323

tests/unit/utils/verifyToken.test.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import jwt from "@tsndr/cloudflare-worker-jwt";
22
import {
3-
verifyAuthToken,
3+
verifyNodejsBackendAuthToken,
44
verifyCronJobsToken,
55
} from "../../../src/utils/verifyAuthToken";
66
import {
77
AUTHENTICATION_ERROR,
88
INVALID_TOKEN_FORMAT,
99
} from "../../../src/constants/responses";
1010

11-
describe("verifyAuthToken", () => {
11+
describe("verifyNodejsBackendAuthToken", () => {
1212
const authToken = "validToken";
1313
const mockEnv = { RDS_SERVERLESS_PUBLIC_KEY: "publicKey" };
1414

@@ -19,7 +19,9 @@ describe("verifyAuthToken", () => {
1919
it("should verify a valid token successfully", async () => {
2020
jwt.verify = jest.fn().mockResolvedValue(true);
2121
const authHeader = `Bearer ${authToken}`;
22-
await expect(verifyAuthToken(authHeader, mockEnv)).resolves.not.toThrow();
22+
await expect(
23+
verifyNodejsBackendAuthToken(authHeader, mockEnv)
24+
).resolves.not.toThrow();
2325
expect(jwt.verify).toHaveBeenCalledWith(
2426
authToken,
2527
mockEnv.RDS_SERVERLESS_PUBLIC_KEY,
@@ -30,22 +32,22 @@ describe("verifyAuthToken", () => {
3032
it("should throw an error for an invalid token", async () => {
3133
const authHeader = "Bearer invalidToken";
3234
jwt.verify = jest.fn().mockResolvedValue(false);
33-
await expect(verifyAuthToken(authHeader, mockEnv)).rejects.toThrow(
34-
AUTHENTICATION_ERROR
35-
);
35+
await expect(
36+
verifyNodejsBackendAuthToken(authHeader, mockEnv)
37+
).rejects.toThrow(AUTHENTICATION_ERROR);
3638
});
3739
it("should throw an error when Bearer is not passed", async () => {
3840
const authHeader = "Beaer invalidToken";
39-
await expect(verifyAuthToken(authHeader, mockEnv)).rejects.toThrow(
40-
INVALID_TOKEN_FORMAT
41-
);
41+
await expect(
42+
verifyNodejsBackendAuthToken(authHeader, mockEnv)
43+
).rejects.toThrow(INVALID_TOKEN_FORMAT);
4244
});
4345

4446
it("should throw an error for a malformed auth header", async () => {
4547
const malformedHeader = "invalidformat";
46-
await expect(verifyAuthToken(malformedHeader, mockEnv)).rejects.toThrow(
47-
INVALID_TOKEN_FORMAT
48-
);
48+
await expect(
49+
verifyNodejsBackendAuthToken(malformedHeader, mockEnv)
50+
).rejects.toThrow(INVALID_TOKEN_FORMAT);
4951
});
5052
});
5153

0 commit comments

Comments
 (0)