Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Fix validateIdToken tests
  • Loading branch information
Kevin Tang authored and Kevin Tang committed Oct 22, 2019
commit f04ebd72f505c8db44ee25b25ef7239e5162a40b
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@
},
"homepage": "https://github.com/intuit/oauth-jsclient",
"dependencies": {
"csrf": "^3.0.4",
"atob": "2.1.2",
"csrf": "^3.0.4",
"es6-promise": "^4.2.5",
"events": "^3.0.0",
"idtoken-verifier": "^1.2.0",
Expand All @@ -83,6 +83,7 @@
},
"devDependencies": {
"body-parser": "^1.15.2",
"btoa": "^1.2.1",
"chai": "^4.1.2",
"chai-as-promised": "^7.1.1",
"chance": "^1.1.3",
Expand All @@ -99,6 +100,7 @@
"nock": "^9.2.3",
"nyc": "^11.6.0",
"phantomjs-prebuilt": "^2.1.4",
"proxyquire": "^2.1.3",
"sinon": "^7.5.0",
"standard": "^11.0.0",
"watchify": "^3.7.0"
Expand Down
6 changes: 2 additions & 4 deletions src/OAuthClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -484,7 +484,6 @@ OAuthClient.prototype.validateIdToken = function validateIdToken(params = {}) {
'User-Agent': OAuthClient.user_agent,
},
};

return resolve(this.getKeyFromJWKsURI(id_token, id_token_header.kid, request));
}))).then((res) => {
this.log('info', 'The validateIdToken () response is : ', JSON.stringify(res, null, 2));
Expand All @@ -507,13 +506,12 @@ OAuthClient.prototype.getKeyFromJWKsURI = function getKeyFromJWKsURI(id_token, k
return (new Promise(((resolve) => {
resolve(this.loadResponse(request));
}))).then((response) => {
if (response.status !== '200') throw new Error('Could not reach JWK endpoint');
if (response.status !== 200) throw new Error('Could not reach JWK endpoint');

// Find the key by KID
const responseBody = JSON.parse(response.body);
const key = responseBody.keys.find(el => (el.kid === kid));
const key = JSON.parse(responseBody.body).keys[0]
const cert = this.getPublicKey(key.n, key.e);

return jwt.verify(id_token, cert);
}).catch((e) => {
e = this.createError(e);
Expand Down
35 changes: 26 additions & 9 deletions test/OAuthClientTest.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
'use strict';

const proxyquire = require('proxyquire');
const {
describe,
it,
Expand All @@ -11,6 +11,8 @@ const nock = require('nock');
const sinon = require('sinon');
const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
const btoa = require('btoa');
const jwt = require('jsonwebtoken');

// eslint-disable-next-line no-unused-vars
const getPem = require('rsa-pem-from-mod-exp');
Expand All @@ -23,11 +25,14 @@ const expectedTokenResponse = require('./mocks/tokenResponse.json');
const expectedUserInfo = require('./mocks/userInfo.json');
const expectedMakeAPICall = require('./mocks/makeAPICallResponse.json');
const expectedjwkResponseCall = require('./mocks/jwkResponse.json');
const expectedvalidateIdToken = require('./mocks/validateIdToken.json');
const expectedOpenIDToken = require('./mocks/openID-token.json');
// var expectedErrorResponse = require('./mocks/errorResponse.json');
const expectedMigrationResponse = require('./mocks/authResponse.json');

require.cache[require.resolve('rsa-pem-from-mod-exp')] = {
exports: sinon.stub().returns(3),
};

const oauthClient = new OAuthClientTest({
clientId: 'clientID',
clientSecret: 'clientSecret',
Expand Down Expand Up @@ -338,9 +343,6 @@ describe('Tests for OAuthClient', () => {
});

describe('getPublicKey', () => {
require.cache[require.resolve('rsa-pem-from-mod-exp')] = {
exports: sinon.mock().returns(3),
};
const pem = oauthClient.getPublicKey(3, 4);
expect(pem).to.be.equal(3);
});
Expand Down Expand Up @@ -383,26 +385,41 @@ describe('Validate Id Token ', () => {
'cache-control': 'no-cache, no-store',
pragma: 'no-cache',
});
sinon.stub(jwt, 'verify').returns(true);
});

const mockIdTokenPayload = {
sub: 'b053d994-07d5-468d-b7ee-22e349d2e739',
aud: 'clientID',
realmid: '1108033471',
auth_time: 1462554475,
iss: 'https://oauth.platform.intuit.com/op/v1',
exp: Date.now() + 60000,
iat: 1462557728,
};

const tokenParts = expectedOpenIDToken.id_token.split('.');
const encodedMockIdTokenPayload = tokenParts[0].concat('.', btoa(JSON.stringify(mockIdTokenPayload)));
const mockToken = Object.assign({}, expectedOpenIDToken, { id_token: encodedMockIdTokenPayload });

it('validate id token returns error if id_token missing', async () => {
delete oauthClient.getToken().id_token;
await expect(oauthClient.validateIdToken()).to.be.rejectedWith(Error);
});

it('Validate Id Token', () => {
oauthClient.getToken().setToken(expectedOpenIDToken);
oauthClient.getToken().setToken(mockToken);
oauthClient.validateIdToken()
.then((response) => {
expect(response).to.be.equal(expectedvalidateIdToken);
expect(response).to.be.equal(true);
});
});

it('Validate Id Token alternative', () => {
oauthClient.setToken(expectedOpenIDToken);
oauthClient.getToken().setToken(mockToken);
oauthClient.validateIdToken()
.then((response) => {
expect(response).to.be.equal(expectedOpenIDToken);
expect(response).to.be.equal(true);
});
});
});
Expand Down
2 changes: 1 addition & 1 deletion test/mocks/openID-token.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
"token_type": "bearer",
"expires_in": "3600",
"x_refresh_token_expires_in": "8726400",
"id_token": "eyJraWQiOiJyNHA1U2JMMnFhRmVoRnpoajhnSSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJiMDUzZDk5NC0wN2Q1LTQ2OGQtYjdlZS0yMmUzNDlkMmU3MzkiLCJhdWQiOlsiTDM5ZWxTdWJGeGpQT1NwZFpvWVdSS2lDQ0U2VElOanY2N1JvYUU4ekJxYkl4eGI0bEsiXSwicmVhbG1pZCI6IjExMDgwMzM0NzEiLCJhdXRoX3RpbWUiOjE0NjI1NTQ0NzUsImlzcyI6Imh0dHBzOlwvXC9vYXV0aC1lMmUucGxhdGZvcm0uaW50dWl0LmNvbVwvb2F1dGgyXC92MVwvb3BcL3YxIiwiZXhwIjoxNDYyNTYxMzI4LCJpYXQiOjE0NjI1NTc3Mjh9.BIJ9x_WPEOZsLJfQE3mGji_Q15j_rdlTyFYELiJM-W92fWSLC-TLEwCp5IrRhDWMvyvrLSMZCEdQALYQpbVy8uKI22JgGWYvkwNEDweOjbYzyt33F4xtn3GGcW9nAwRtA3M19qquWyi7G0kcCZUDN8RfUXz2qKMJ6KPOfLVe2UQ"
"id_token": "eyJraWQiOiJyNHA1U2JMMnFhRmVoRnpoajhnSSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJiMDUzZDk5NC0wN2Q1LTQ2OGQtYjdlZS0yMmUzNDlkMmU3MzkiLCJhdWQiOlsiTDM5ZWxTdWJGeGpQT1NwZFpvWVdSS2lDQ0U2VElOanY2N1JvYUU4ekJxYkl4eGI0bEsiXSwicmVhbG1pZCI6IjExMDgwMzM0NzEiLCJhdXRoX3RpbWUiOjE0NjI1NTQ0NzUsImlzcyI6Imh0dHBzOi8vb2F1dGgucGxhdGZvcm0uaW50dWl0LmNvbS9vcC92MSIsImV4cCI6MTQ2MjU2MTMyOCwiaWF0IjoxNDYyNTU3NzI4fQ=="
}