Skip to content

Commit 42d948d

Browse files
authored
Merge f8e5cd7 into 30576f1
2 parents 30576f1 + f8e5cd7 commit 42d948d

File tree

8 files changed

+333
-330
lines changed

8 files changed

+333
-330
lines changed

package-lock.json

Lines changed: 283 additions & 272 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"graphql-tag": "2.12.6",
3838
"graphql-relay": "0.10.0",
3939
"intersect": "1.0.1",
40-
"jsonwebtoken": "8.5.1",
40+
"jsonwebtoken": "9.0.0",
4141
"jwks-rsa": "2.1.4",
4242
"ldapjs": "2.3.3",
4343
"lodash": "4.17.21",

spec/AuthenticationAdapters.spec.js

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,7 @@ describe('instagram auth adapter', () => {
596596
describe('google auth adapter', () => {
597597
const google = require('../lib/Adapters/Auth/google');
598598
const jwt = require('jsonwebtoken');
599+
const authUtils = require('../lib/Adapters/Auth/utils');
599600

600601
it('should throw error with missing id_token', async () => {
601602
try {
@@ -618,7 +619,7 @@ describe('google auth adapter', () => {
618619
// it('should throw error if public key used to encode token is not available', async () => {
619620
// const fakeDecodedToken = { header: { kid: '789', alg: 'RS256' } };
620621
// try {
621-
// spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
622+
// spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
622623

623624
// await google.validateAuthData({ id: 'the_user_id', id_token: 'the_token' }, {});
624625
// fail();
@@ -637,7 +638,7 @@ describe('google auth adapter', () => {
637638
sub: 'the_user_id',
638639
};
639640
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
640-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
641+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
641642
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
642643

643644
const result = await google.validateAuthData(
@@ -653,7 +654,7 @@ describe('google auth adapter', () => {
653654
sub: 'the_user_id',
654655
};
655656
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
656-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
657+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
657658
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
658659

659660
try {
@@ -677,7 +678,7 @@ describe('google auth adapter', () => {
677678
sub: 'the_user_id',
678679
};
679680
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
680-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
681+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
681682
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
682683

683684
try {
@@ -699,7 +700,7 @@ describe('google auth adapter', () => {
699700
sub: 'the_user_id',
700701
};
701702
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
702-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
703+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
703704
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
704705

705706
try {
@@ -1402,6 +1403,7 @@ describe('apple signin auth adapter', () => {
14021403
const apple = require('../lib/Adapters/Auth/apple');
14031404
const jwt = require('jsonwebtoken');
14041405
const util = require('util');
1406+
const authUtils = require('../lib/Adapters/Auth/utils');
14051407

14061408
it('(using client id as string) should throw error with missing id_token', async () => {
14071409
try {
@@ -1436,7 +1438,7 @@ describe('apple signin auth adapter', () => {
14361438
it('should throw error if public key used to encode token is not available', async () => {
14371439
const fakeDecodedToken = { header: { kid: '789', alg: 'RS256' } };
14381440
try {
1439-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
1441+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken.header);
14401442

14411443
await apple.validateAuthData(
14421444
{ id: 'the_user_id', token: 'the_token' },
@@ -1458,7 +1460,7 @@ describe('apple signin auth adapter', () => {
14581460
sub: 'the_user_id',
14591461
};
14601462
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
1461-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
1463+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken.header);
14621464
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
14631465
const fakeGetSigningKeyAsyncFunction = () => {
14641466
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
@@ -1475,7 +1477,7 @@ describe('apple signin auth adapter', () => {
14751477

14761478
it('should not verify invalid id_token', async () => {
14771479
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
1478-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
1480+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
14791481
const fakeGetSigningKeyAsyncFunction = () => {
14801482
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
14811483
};
@@ -1512,7 +1514,7 @@ describe('apple signin auth adapter', () => {
15121514
sub: 'the_user_id',
15131515
};
15141516
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
1515-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
1517+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
15161518
const fakeGetSigningKeyAsyncFunction = () => {
15171519
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
15181520
};
@@ -1534,7 +1536,7 @@ describe('apple signin auth adapter', () => {
15341536
sub: 'the_user_id',
15351537
};
15361538
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
1537-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
1539+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
15381540
const fakeGetSigningKeyAsyncFunction = () => {
15391541
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
15401542
};
@@ -1556,7 +1558,7 @@ describe('apple signin auth adapter', () => {
15561558
sub: 'the_user_id',
15571559
};
15581560
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
1559-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
1561+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
15601562
const fakeGetSigningKeyAsyncFunction = () => {
15611563
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
15621564
};
@@ -1576,7 +1578,7 @@ describe('apple signin auth adapter', () => {
15761578
sub: 'the_user_id',
15771579
};
15781580
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
1579-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
1581+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
15801582
const fakeGetSigningKeyAsyncFunction = () => {
15811583
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
15821584
};
@@ -1604,7 +1606,7 @@ describe('apple signin auth adapter', () => {
16041606
sub: 'the_user_id',
16051607
};
16061608
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
1607-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
1609+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
16081610
const fakeGetSigningKeyAsyncFunction = () => {
16091611
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
16101612
};
@@ -1633,7 +1635,7 @@ describe('apple signin auth adapter', () => {
16331635
sub: 'the_user_id',
16341636
};
16351637
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
1636-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
1638+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
16371639
const fakeGetSigningKeyAsyncFunction = () => {
16381640
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
16391641
};
@@ -1705,7 +1707,7 @@ describe('apple signin auth adapter', () => {
17051707
sub: 'a_different_user_id',
17061708
};
17071709
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
1708-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
1710+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
17091711
const fakeGetSigningKeyAsyncFunction = () => {
17101712
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
17111713
};
@@ -1972,6 +1974,7 @@ describe('facebook limited auth adapter', () => {
19721974
const facebook = require('../lib/Adapters/Auth/facebook');
19731975
const jwt = require('jsonwebtoken');
19741976
const util = require('util');
1977+
const authUtils = require('../lib/Adapters/Auth/utils');
19751978

19761979
// TODO: figure out a way to run this test alongside facebook classic tests
19771980
xit('(using client id as string) should throw error with missing id_token', async () => {
@@ -2010,7 +2013,7 @@ describe('facebook limited auth adapter', () => {
20102013
header: { kid: '789', alg: 'RS256' },
20112014
};
20122015
try {
2013-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
2016+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken.header);
20142017

20152018
await facebook.validateAuthData(
20162019
{ id: 'the_user_id', token: 'the_token' },
@@ -2034,7 +2037,7 @@ describe('facebook limited auth adapter', () => {
20342037
const fakeDecodedToken = {
20352038
header: { kid: '123', alg: 'RS256' },
20362039
};
2037-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
2040+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken.header);
20382041
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
20392042
const fakeGetSigningKeyAsyncFunction = () => {
20402043
return {
@@ -2056,7 +2059,7 @@ describe('facebook limited auth adapter', () => {
20562059
const fakeDecodedToken = {
20572060
header: { kid: '123', alg: 'RS256' },
20582061
};
2059-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
2062+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
20602063
const fakeGetSigningKeyAsyncFunction = () => {
20612064
return {
20622065
kid: '123',
@@ -2098,7 +2101,7 @@ describe('facebook limited auth adapter', () => {
20982101
const fakeDecodedToken = {
20992102
header: { kid: '123', alg: 'RS256' },
21002103
};
2101-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
2104+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
21022105
const fakeGetSigningKeyAsyncFunction = () => {
21032106
return {
21042107
kid: '123',
@@ -2125,7 +2128,7 @@ describe('facebook limited auth adapter', () => {
21252128
const fakeDecodedToken = {
21262129
header: { kid: '123', alg: 'RS256' },
21272130
};
2128-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
2131+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
21292132
const fakeGetSigningKeyAsyncFunction = () => {
21302133
return {
21312134
kid: '123',
@@ -2152,7 +2155,7 @@ describe('facebook limited auth adapter', () => {
21522155
const fakeDecodedToken = {
21532156
header: { kid: '123', alg: 'RS256' },
21542157
};
2155-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
2158+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
21562159
const fakeGetSigningKeyAsyncFunction = () => {
21572160
return {
21582161
kid: '123',
@@ -2177,7 +2180,7 @@ describe('facebook limited auth adapter', () => {
21772180
const fakeDecodedToken = {
21782181
header: { kid: '123', alg: 'RS256' },
21792182
};
2180-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
2183+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
21812184
const fakeGetSigningKeyAsyncFunction = () => {
21822185
return {
21832186
kid: '123',
@@ -2210,7 +2213,7 @@ describe('facebook limited auth adapter', () => {
22102213
const fakeDecodedToken = {
22112214
header: { kid: '123', alg: 'RS256' },
22122215
};
2213-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
2216+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
22142217
const fakeGetSigningKeyAsyncFunction = () => {
22152218
return {
22162219
kid: '123',
@@ -2244,7 +2247,7 @@ describe('facebook limited auth adapter', () => {
22442247
const fakeDecodedToken = {
22452248
header: { kid: '123', alg: 'RS256' },
22462249
};
2247-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
2250+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
22482251
const fakeGetSigningKeyAsyncFunction = () => {
22492252
return {
22502253
kid: '123',
@@ -2330,7 +2333,7 @@ describe('facebook limited auth adapter', () => {
23302333
const fakeDecodedToken = {
23312334
header: { kid: '123', alg: 'RS256' },
23322335
};
2333-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
2336+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
23342337
const fakeGetSigningKeyAsyncFunction = () => {
23352338
return {
23362339
kid: '123',

spec/index.spec.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,7 @@ describe('server', () => {
553553

554554
it('should not fail when Google signin is introduced without the optional clientId', done => {
555555
const jwt = require('jsonwebtoken');
556+
const authUtils = require('../lib/Adapters/Auth/utils');
556557

557558
reconfigureServer({
558559
auth: { google: {} },
@@ -565,7 +566,7 @@ describe('server', () => {
565566
sub: 'the_user_id',
566567
};
567568
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
568-
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
569+
spyOn(authUtils, 'getHeaderFromToken').and.callFake(() => fakeDecodedToken);
569570
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
570571
const user = new Parse.User();
571572
user

src/Adapters/Auth/apple.js

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const Parse = require('parse/node').Parse;
55
const jwksClient = require('jwks-rsa');
66
const util = require('util');
77
const jwt = require('jsonwebtoken');
8+
const authUtils = require('./utils');
89

910
const TOKEN_ISSUER = 'https://appleid.apple.com';
1011

@@ -30,21 +31,12 @@ const getAppleKeyByKeyId = async (keyId, cacheMaxEntries, cacheMaxAge) => {
3031
return key;
3132
};
3233

33-
const getHeaderFromToken = token => {
34-
const decodedToken = jwt.decode(token, { complete: true });
35-
if (!decodedToken) {
36-
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `provided token does not decode as JWT`);
37-
}
38-
39-
return decodedToken.header;
40-
};
41-
4234
const verifyIdToken = async ({ token, id }, { clientId, cacheMaxEntries, cacheMaxAge }) => {
4335
if (!token) {
4436
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token is invalid for this user.`);
4537
}
4638

47-
const { kid: keyId, alg: algorithm } = getHeaderFromToken(token);
39+
const { kid: keyId, alg: algorithm } = authUtils.getHeaderFromToken(token);
4840
const ONE_HOUR_IN_MS = 3600000;
4941
let jwtClaims;
5042

src/Adapters/Auth/facebook.js

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const jwksClient = require('jwks-rsa');
55
const util = require('util');
66
const jwt = require('jsonwebtoken');
77
const httpsRequest = require('./httpsRequest');
8+
const authUtils = require('./utils');
89

910
const TOKEN_ISSUER = 'https://facebook.com';
1011

@@ -73,21 +74,12 @@ const getFacebookKeyByKeyId = async (keyId, cacheMaxEntries, cacheMaxAge) => {
7374
return key;
7475
};
7576

76-
const getHeaderFromToken = token => {
77-
const decodedToken = jwt.decode(token, { complete: true });
78-
if (!decodedToken) {
79-
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'provided token does not decode as JWT');
80-
}
81-
82-
return decodedToken.header;
83-
};
84-
8577
const verifyIdToken = async ({ token, id }, { clientId, cacheMaxEntries, cacheMaxAge }) => {
8678
if (!token) {
8779
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'id token is invalid for this user.');
8880
}
8981

90-
const { kid: keyId, alg: algorithm } = getHeaderFromToken(token);
82+
const { kid: keyId, alg: algorithm } = authUtils.getHeaderFromToken(token);
9183
const ONE_HOUR_IN_MS = 3600000;
9284
let jwtClaims;
9385

src/Adapters/Auth/google.js

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var Parse = require('parse/node').Parse;
55

66
const https = require('https');
77
const jwt = require('jsonwebtoken');
8+
const authUtils = require('./utils');
89

910
const TOKEN_ISSUER = 'accounts.google.com';
1011
const HTTPS_TOKEN_ISSUER = 'https://accounts.google.com';
@@ -51,22 +52,12 @@ function getGoogleKeyByKeyId(keyId) {
5152
});
5253
}
5354

54-
function getHeaderFromToken(token) {
55-
const decodedToken = jwt.decode(token, { complete: true });
56-
57-
if (!decodedToken) {
58-
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `provided token does not decode as JWT`);
59-
}
60-
61-
return decodedToken.header;
62-
}
63-
6455
async function verifyIdToken({ id_token: token, id }, { clientId }) {
6556
if (!token) {
6657
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token is invalid for this user.`);
6758
}
6859

69-
const { kid: keyId, alg: algorithm } = getHeaderFromToken(token);
60+
const { kid: keyId, alg: algorithm } = authUtils.getHeaderFromToken(token);
7061
let jwtClaims;
7162
const googleKey = await getGoogleKeyByKeyId(keyId);
7263

src/Adapters/Auth/utils.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const jwt = require('jsonwebtoken');
2+
const Parse = require('parse/node').Parse;
3+
const getHeaderFromToken = token => {
4+
const decodedToken = jwt.decode(token, { complete: true });
5+
if (!decodedToken) {
6+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `provided token does not decode as JWT`);
7+
}
8+
9+
return decodedToken.header;
10+
};
11+
module.exports = {
12+
getHeaderFromToken,
13+
};

0 commit comments

Comments
 (0)