Skip to content

Commit 82d9367

Browse files
feat: add JWT authentication support (hoppscotch#5079)
Co-authored-by: jamesgeorge007 <[email protected]>
1 parent e1f78b1 commit 82d9367

File tree

27 files changed

+1212
-729
lines changed

27 files changed

+1212
-729
lines changed

packages/hoppscotch-cli/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
"qs": "6.13.0",
5353
"verzod": "0.2.4",
5454
"xmlbuilder2": "3.1.1",
55-
"zod": "3.23.8"
55+
"zod": "3.25.32"
5656
},
5757
"devDependencies": {
5858
"@hoppscotch/data": "workspace:^",
@@ -66,7 +66,7 @@
6666
"qs": "6.11.2",
6767
"semver": "7.6.3",
6868
"tsup": "8.3.0",
69-
"typescript": "5.6.3",
69+
"typescript": "5.8.3",
7070
"vitest": "2.1.2"
7171
}
7272
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"v": 3,
3+
"name": "JWT Auth (headers) - collection",
4+
"folders": [],
5+
"requests": [
6+
{
7+
"v": "13",
8+
"id": "cm0dm70cw000687bnxi830zz3",
9+
"auth": {
10+
"authType": "jwt",
11+
"authActive": true,
12+
"addTo": "HEADERS",
13+
"algorithm": "<<algorithm>>",
14+
"secret": "<<secret>>",
15+
"privateKey": "<<privateKey>>",
16+
"payload": "<<payload>>",
17+
"jwtHeaders": "<<jwtHeaders>>",
18+
"headerPrefix": "<<headerPrefix>>",
19+
"isSecretBase64Encoded": false
20+
},
21+
"body": {
22+
"body": null,
23+
"contentType": null
24+
},
25+
"name": "jwt-auth-headers",
26+
"method": "GET",
27+
"params": [],
28+
"headers": [],
29+
"endpoint": "<<url>>",
30+
"testScript": "pw.test(\"Status code is 200\", ()=> { pw.expect(pw.response.status).toBe(200);});",
31+
"preRequestScript": "",
32+
"responses": {},
33+
"requestVariables": []
34+
}
35+
],
36+
"auth": {
37+
"authType": "inherit",
38+
"authActive": true
39+
},
40+
"headers": []
41+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"v": 3,
3+
"name": "JWT Auth (params) - collection",
4+
"folders": [],
5+
"requests": [
6+
{
7+
"v": "13",
8+
"id": "cm0dm70cw000687bnxi830zz4",
9+
"auth": {
10+
"authType": "jwt",
11+
"authActive": true,
12+
"addTo": "QUERY_PARAMS",
13+
"algorithm": "<<algorithm>>",
14+
"secret": "<<secret>>",
15+
"privateKey": "<<privateKey>>",
16+
"payload": "<<payload>>",
17+
"jwtHeaders": "<<jwtHeaders>>",
18+
"paramName": "<<paramName>>",
19+
"isSecretBase64Encoded": false
20+
},
21+
"body": {
22+
"body": null,
23+
"contentType": null
24+
},
25+
"name": "jwt-auth-params",
26+
"method": "GET",
27+
"params": [],
28+
"headers": [],
29+
"endpoint": "<<url>>",
30+
"testScript": "pw.test(\"Status code is 200\", ()=> { pw.expect(pw.response.status).toBe(200);});",
31+
"preRequestScript": "",
32+
"responses": {},
33+
"requestVariables": []
34+
}
35+
],
36+
"auth": {
37+
"authType": "inherit",
38+
"authActive": true
39+
},
40+
"headers": []
41+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"v": 1,
3+
"id": "cm0dsn3v70004p4qk3l9b7sjn",
4+
"name": "JWT Auth - environments",
5+
"variables": [
6+
{
7+
"key": "url",
8+
"value": "http://localhost:8888/auth/jwt"
9+
},
10+
{
11+
"key": "algorithm",
12+
"value": "HS256"
13+
},
14+
{
15+
"key": "secret",
16+
"value": "secret-1"
17+
},
18+
{
19+
"key": "privateKey",
20+
"value": ""
21+
},
22+
{
23+
"key": "payload",
24+
"value": "{\"user\":\"test\",\"role\":\"admin\"}"
25+
},
26+
{
27+
"key": "jwtHeaders",
28+
"value": "{}"
29+
},
30+
{
31+
"key": "headerPrefix",
32+
"value": "Bearer "
33+
},
34+
{
35+
"key": "paramName",
36+
"value": "token"
37+
},
38+
{
39+
"key": "isSecretBase64Encoded",
40+
"value": "false"
41+
}
42+
]
43+
}

packages/hoppscotch-cli/src/__tests__/unit/fixtures/workspace-access.mock.ts

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -485,17 +485,17 @@ export const WORKSPACE_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK: Worksp
485485
export const TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK: HoppCollection[] =
486486
[
487487
{
488-
v: 7,
488+
v: 8,
489489
id: "clx1f86hv000010f8szcfya0t",
490490
name: "Multiple child collections with authorization & headers set at each level",
491491
folders: [
492492
{
493-
v: 7,
493+
v: 8,
494494
id: "clx1fjgah000110f8a5bs68gd",
495495
name: "folder-1",
496496
folders: [
497497
{
498-
v: 7,
498+
v: 8,
499499
id: "clx1fjwmm000410f8l1gkkr1a",
500500
name: "folder-11",
501501
folders: [],
@@ -537,7 +537,7 @@ export const TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK: Hopp
537537
],
538538
},
539539
{
540-
v: 7,
540+
v: 8,
541541
id: "clx1fjyxm000510f8pv90dt43",
542542
name: "folder-12",
543543
folders: [],
@@ -595,7 +595,7 @@ export const TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK: Hopp
595595
],
596596
},
597597
{
598-
v: 7,
598+
v: 8,
599599
id: "clx1fk1cv000610f88kc3aupy",
600600
name: "folder-13",
601601
folders: [],
@@ -707,12 +707,12 @@ export const TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK: Hopp
707707
],
708708
},
709709
{
710-
v: 7,
710+
v: 8,
711711
id: "clx1fjk9o000210f8j0573pls",
712712
name: "folder-2",
713713
folders: [
714714
{
715-
v: 7,
715+
v: 8,
716716
id: "clx1fk516000710f87sfpw6bo",
717717
name: "folder-21",
718718
folders: [],
@@ -752,7 +752,7 @@ export const TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK: Hopp
752752
],
753753
},
754754
{
755-
v: 7,
755+
v: 8,
756756
id: "clx1fk72t000810f8gfwkpi5y",
757757
name: "folder-22",
758758
folders: [],
@@ -810,7 +810,7 @@ export const TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK: Hopp
810810
],
811811
},
812812
{
813-
v: 7,
813+
v: 8,
814814
id: "clx1fk95g000910f8bunhaoo8",
815815
name: "folder-23",
816816
folders: [],
@@ -915,12 +915,12 @@ export const TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK: Hopp
915915
],
916916
},
917917
{
918-
v: 7,
918+
v: 8,
919919
id: "clx1fjmlq000310f86o4d3w2o",
920920
name: "folder-3",
921921
folders: [
922922
{
923-
v: 7,
923+
v: 8,
924924
id: "clx1iwq0p003e10f8u8zg0p85",
925925
name: "folder-31",
926926
folders: [],
@@ -960,7 +960,7 @@ export const TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK: Hopp
960960
],
961961
},
962962
{
963-
v: 7,
963+
v: 8,
964964
id: "clx1izut7003m10f894ip59zg",
965965
name: "folder-32",
966966
folders: [],
@@ -1018,7 +1018,7 @@ export const TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK: Hopp
10181018
],
10191019
},
10201020
{
1021-
v: 7,
1021+
v: 8,
10221022
id: "clx1j2ka9003q10f8cdbzpgpg",
10231023
name: "folder-33",
10241024
folders: [],
@@ -1372,42 +1372,50 @@ export const WORKSPACE_ENVIRONMENT_MOCK: WorkspaceEnvironment = {
13721372
variables: [
13731373
{
13741374
key: "firstName",
1375-
value: "John",
1375+
initialValue: "John",
1376+
currentValue: "John",
13761377
secret: false,
13771378
},
13781379
{
13791380
key: "lastName",
1380-
value: "Doe",
1381+
initialValue: "Doe",
1382+
currentValue: "Doe",
13811383
secret: false,
13821384
},
13831385
{
13841386
key: "id",
1385-
value: "7",
1387+
initialValue: "7",
1388+
currentValue: "7",
13861389
secret: false,
13871390
},
13881391
{
13891392
key: "fullName",
1390-
value: "<<firstName>> <<lastName>>",
1393+
initialValue: "<<firstName>> <<lastName>>",
1394+
currentValue: "<<firstName>> <<lastName>>",
13911395
secret: false,
13921396
},
13931397
{
13941398
key: "recursiveVarX",
1395-
value: "<<recursiveVarY>>",
1399+
initialValue: "<<recursiveVarY>>",
1400+
currentValue: "<<recursiveVarY>>",
13961401
secret: false,
13971402
},
13981403
{
13991404
key: "recursiveVarY",
1400-
value: "<<salutation>>",
1405+
initialValue: "<<salutation>>",
1406+
currentValue: "<<salutation>>",
14011407
secret: false,
14021408
},
14031409
{
14041410
key: "salutation",
1405-
value: "Hello",
1411+
initialValue: "Hello",
1412+
currentValue: "Hello",
14061413
secret: false,
14071414
},
14081415
{
14091416
key: "greetText",
1410-
value: "<<salutation>> <<fullName>>",
1417+
initialValue: "<<salutation>> <<fullName>>",
1418+
currentValue: "<<salutation>> <<fullName>>",
14111419
secret: false,
14121420
},
14131421
],
@@ -1420,42 +1428,50 @@ export const TRANSFORMED_ENVIRONMENT_MOCK: Environment = {
14201428
variables: [
14211429
{
14221430
key: "firstName",
1423-
value: "John",
1431+
initialValue: "John",
1432+
currentValue: "John",
14241433
secret: false,
14251434
},
14261435
{
14271436
key: "lastName",
1428-
value: "Doe",
1437+
initialValue: "Doe",
1438+
currentValue: "Doe",
14291439
secret: false,
14301440
},
14311441
{
14321442
key: "id",
1433-
value: "7",
1443+
initialValue: "7",
1444+
currentValue: "7",
14341445
secret: false,
14351446
},
14361447
{
14371448
key: "fullName",
1438-
value: "<<firstName>> <<lastName>>",
1449+
initialValue: "<<firstName>> <<lastName>>",
1450+
currentValue: "<<firstName>> <<lastName>>",
14391451
secret: false,
14401452
},
14411453
{
14421454
key: "recursiveVarX",
1443-
value: "<<recursiveVarY>>",
1455+
initialValue: "<<recursiveVarY>>",
1456+
currentValue: "<<recursiveVarY>>",
14441457
secret: false,
14451458
},
14461459
{
14471460
key: "recursiveVarY",
1448-
value: "<<salutation>>",
1461+
initialValue: "<<salutation>>",
1462+
currentValue: "<<salutation>>",
14491463
secret: false,
14501464
},
14511465
{
14521466
key: "salutation",
1453-
value: "Hello",
1467+
initialValue: "Hello",
1468+
currentValue: "Hello",
14541469
secret: false,
14551470
},
14561471
{
14571472
key: "greetText",
1458-
value: "<<salutation>> <<fullName>>",
1473+
initialValue: "<<salutation>> <<fullName>>",
1474+
currentValue: "<<salutation>> <<fullName>>",
14591475
secret: false,
14601476
},
14611477
],

0 commit comments

Comments
 (0)