bitgo
Version:
BitGo JavaScript SDK
106 lines • 15.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const nock = require("nock");
require("should");
const sinon = require("sinon");
const src_1 = require("../../../src");
describe('Auth', () => {
let sandbox;
beforeEach(() => {
sandbox = sinon.createSandbox();
});
afterEach(() => {
sandbox.restore();
});
describe('Auth V3', () => {
it('should set auth version to 3 when initializing a bitgo object with explicit auth version 3', () => {
const bitgo = new src_1.BitGo({ authVersion: 3 });
bitgo.getAuthVersion().should.eql(3);
});
it('should pass "3.0" as the bitgo-auth-version header when auth v3 is enabled', async () => {
const url = 'https://bitgo.invalid';
const bitgo = new src_1.BitGo({ authVersion: 3 });
const scope = nock(url, {
reqheaders: {
'bitgo-auth-version': '3.0',
},
})
.get('/')
.reply(200);
await bitgo.get(url).should.eventually.have.property('status', 200);
scope.done();
});
it('should reject responses outside the response validity window', async () => {
const url = 'https://bitgo.invalid';
const bitgo = new src_1.BitGo({ authVersion: 3, accessToken: `v2x${'0'.repeat(64)}` });
const verifyResponseStub = sinon.stub(bitgo, 'verifyResponse').returns({
isValid: true,
isInResponseValidityWindow: false,
expectedHmac: '',
signatureSubject: '',
verificationTime: 0,
});
const scope = nock(url).get('/').reply(200);
await bitgo.get(url).should.be.rejectedWith('server response outside response validity time window');
verifyResponseStub.restore();
scope.done();
});
it('should accept responses within the response validity window', async () => {
const url = 'https://bitgo.invalid';
const bitgo = new src_1.BitGo({ authVersion: 3, accessToken: `v2x${'0'.repeat(64)}` });
const verifyResponseStub = sinon.stub(bitgo, 'verifyResponse').returns({
isValid: true,
isInResponseValidityWindow: true,
expectedHmac: '',
signatureSubject: '',
verificationTime: 0,
});
const scope = nock(url).get('/').reply(200);
await bitgo.get(url).should.eventually.have.property('status', 200);
verifyResponseStub.restore();
scope.done();
});
it('should include the auth version in the hmac subject', async () => {
const url = 'https://bitgo.invalid';
const accessToken = `v2x${'0'.repeat(64)}`;
const bitgo = new src_1.BitGo({ authVersion: 3, accessToken });
const crypto = require('crypto');
const createHmacSpy = sinon.spy(crypto, 'createHmac');
const updateSpy = sinon.spy(crypto.Hmac.prototype, 'update');
const verifyResponseStub = sinon.stub(bitgo, 'verifyResponse').returns({
isValid: true,
isInResponseValidityWindow: true,
expectedHmac: '',
signatureSubject: '',
verificationTime: 0,
});
const scope = nock(url).get('/').reply(200);
await bitgo.get(url).should.eventually.have.property('status', 200);
createHmacSpy.firstCall.calledWith('sha256', accessToken).should.be.true();
updateSpy.firstCall.calledWith(sinon.match('3.0')).should.be.true();
createHmacSpy.restore();
verifyResponseStub.restore();
scope.done();
});
});
describe('Auth V2', () => {
it('should default to auth version 2 when initializing a bitgo object', () => {
const bitgo = new src_1.BitGo();
bitgo.getAuthVersion().should.eql(2);
});
it('should pass "2.0" as the bitgo-auth-version header when auth v2 is enabled', async () => {
const url = 'https://bitgo.invalid';
const bitgo = new src_1.BitGo();
const scope = nock(url, {
reqheaders: {
'bitgo-auth-version': '2.0',
},
})
.get('/')
.reply(200);
await bitgo.get(url).should.eventually.have.property('status', 200);
scope.done();
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQThCO0FBQzlCLGtCQUFnQjtBQUNoQiwrQkFBK0I7QUFFL0Isc0NBQXFDO0FBRXJDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0lBQ3BCLElBQUksT0FBTyxDQUFDO0lBQ1osVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE9BQU8sR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLDRGQUE0RixFQUFFLEdBQUcsRUFBRTtZQUNwRyxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQUssQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRFQUE0RSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFGLE1BQU0sR0FBRyxHQUFHLHVCQUF1QixDQUFDO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBSyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDdEIsVUFBVSxFQUFFO29CQUNWLG9CQUFvQixFQUFFLEtBQUs7aUJBQzVCO2FBQ0YsQ0FBQztpQkFDQyxHQUFHLENBQUMsR0FBRyxDQUFDO2lCQUNSLEtBQUss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LENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLG1FQUFtRSxFQUFFLEdBQUcsRUFBRTtZQUMzRSxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQUssRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRFQUE0RSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFGLE1BQU0sR0FBRyxHQUFHLHVCQUF1QixDQUFDO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBSyxFQUFFLENBQUM7WUFFMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDdEIsVUFBVSxFQUFFO29CQUNWLG9CQUFvQixFQUFFLEtBQUs7aUJBQzVCO2FBQ0YsQ0FBQztpQkFDQyxHQUFHLENBQUMsR0FBRyxDQUFDO2lCQUNSLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVkLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuXG5pbXBvcnQgeyBCaXRHbyB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdBdXRoJywgKCkgPT4ge1xuICBsZXQgc2FuZGJveDtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgfSk7XG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgc2FuZGJveC5yZXN0b3JlKCk7XG4gIH0pO1xuICBkZXNjcmliZSgnQXV0aCBWMycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNldCBhdXRoIHZlcnNpb24gdG8gMyB3aGVuIGluaXRpYWxpemluZyBhIGJpdGdvIG9iamVjdCB3aXRoIGV4cGxpY2l0IGF1dGggdmVyc2lvbiAzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R28oeyBhdXRoVmVyc2lvbjogMyB9KTtcbiAgICAgIGJpdGdvLmdldEF1dGhWZXJzaW9uKCkuc2hvdWxkLmVxbCgzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyBcIjMuMFwiIGFzIHRoZSBiaXRnby1hdXRoLXZlcnNpb24gaGVhZGVyIHdoZW4gYXV0aCB2MyBpcyBlbmFibGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vYml0Z28uaW52YWxpZCc7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHbyh7IGF1dGhWZXJzaW9uOiAzIH0pO1xuXG4gICAgICBjb25zdCBzY29wZSA9IG5vY2sodXJsLCB7XG4gICAgICAgIHJlcWhlYWRlcnM6IHtcbiAgICAgICAgICAnYml0Z28tYXV0aC12ZXJzaW9uJzogJzMuMCcsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgICAuZ2V0KCcvJylcbiAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgIGF3YWl0IGJpdGdvLmdldCh1cmwpLnNob3VsZC5ldmVudHVhbGx5LmhhdmUucHJvcGVydHkoJ3N0YXR1cycsIDIwMCk7XG4gICAgICBzY29wZS5kb25lKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCByZXNwb25zZXMgb3V0c2lkZSB0aGUgcmVzcG9uc2UgdmFsaWRpdHkgd2luZG93JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vYml0Z28uaW52YWxpZCc7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHbyh7IGF1dGhWZXJzaW9uOiAzLCBhY2Nlc3NUb2tlbjogYHYyeCR7JzAnLnJlcGVhdCg2NCl9YCB9KTtcblxuICAgICAgY29uc3QgdmVyaWZ5UmVzcG9uc2VTdHViID0gc2lub24uc3R1YihiaXRnbywgJ3ZlcmlmeVJlc3BvbnNlJykucmV0dXJucyh7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIGlzSW5SZXNwb25zZVZhbGlkaXR5V2luZG93OiBmYWxzZSxcbiAgICAgICAgZXhwZWN0ZWRIbWFjOiAnJyxcbiAgICAgICAgc2lnbmF0dXJlU3ViamVjdDogJycsXG4gICAgICAgIHZlcmlmaWNhdGlvblRpbWU6IDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2NvcGUgPSBub2NrKHVybCkuZ2V0KCcvJykucmVwbHkoMjAwKTtcblxuICAgICAgYXdhaXQgYml0Z28uZ2V0KHVybCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnc2VydmVyIHJlc3BvbnNlIG91dHNpZGUgcmVzcG9uc2UgdmFsaWRpdHkgdGltZSB3aW5kb3cnKTtcbiAgICAgIHZlcmlmeVJlc3BvbnNlU3R1Yi5yZXN0b3JlKCk7XG4gICAgICBzY29wZS5kb25lKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCByZXNwb25zZXMgd2l0aGluIHRoZSByZXNwb25zZSB2YWxpZGl0eSB3aW5kb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly9iaXRnby5pbnZhbGlkJztcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvKHsgYXV0aFZlcnNpb246IDMsIGFjY2Vzc1Rva2VuOiBgdjJ4JHsnMCcucmVwZWF0KDY0KX1gIH0pO1xuXG4gICAgICBjb25zdCB2ZXJpZnlSZXNwb25zZVN0dWIgPSBzaW5vbi5zdHViKGJpdGdvLCAndmVyaWZ5UmVzcG9uc2UnKS5yZXR1cm5zKHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgaXNJblJlc3BvbnNlVmFsaWRpdHlXaW5kb3c6IHRydWUsXG4gICAgICAgIGV4cGVjdGVkSG1hYzogJycsXG4gICAgICAgIHNpZ25hdHVyZVN1YmplY3Q6ICcnLFxuICAgICAgICB2ZXJpZmljYXRpb25UaW1lOiAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gbm9jayh1cmwpLmdldCgnLycpLnJlcGx5KDIwMCk7XG5cbiAgICAgIGF3YWl0IGJpdGdvLmdldCh1cmwpLnNob3VsZC5ldmVudHVhbGx5LmhhdmUucHJvcGVydHkoJ3N0YXR1cycsIDIwMCk7XG4gICAgICB2ZXJpZnlSZXNwb25zZVN0dWIucmVzdG9yZSgpO1xuICAgICAgc2NvcGUuZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIHRoZSBhdXRoIHZlcnNpb24gaW4gdGhlIGhtYWMgc3ViamVjdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL2JpdGdvLmludmFsaWQnO1xuICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBgdjJ4JHsnMCcucmVwZWF0KDY0KX1gO1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R28oeyBhdXRoVmVyc2lvbjogMywgYWNjZXNzVG9rZW4gfSk7XG5cbiAgICAgIGNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICAgICAgY29uc3QgY3JlYXRlSG1hY1NweSA9IHNpbm9uLnNweShjcnlwdG8sICdjcmVhdGVIbWFjJyk7XG4gICAgICBjb25zdCB1cGRhdGVTcHkgPSBzaW5vbi5zcHkoY3J5cHRvLkhtYWMucHJvdG90eXBlLCAndXBkYXRlJyk7XG5cbiAgICAgIGNvbnN0IHZlcmlmeVJlc3BvbnNlU3R1YiA9IHNpbm9uLnN0dWIoYml0Z28sICd2ZXJpZnlSZXNwb25zZScpLnJldHVybnMoe1xuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBpc0luUmVzcG9uc2VWYWxpZGl0eVdpbmRvdzogdHJ1ZSxcbiAgICAgICAgZXhwZWN0ZWRIbWFjOiAnJyxcbiAgICAgICAgc2lnbmF0dXJlU3ViamVjdDogJycsXG4gICAgICAgIHZlcmlmaWNhdGlvblRpbWU6IDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2NvcGUgPSBub2NrKHVybCkuZ2V0KCcvJykucmVwbHkoMjAwKTtcblxuICAgICAgYXdhaXQgYml0Z28uZ2V0KHVybCkuc2hvdWxkLmV2ZW50dWFsbHkuaGF2ZS5wcm9wZXJ0eSgnc3RhdHVzJywgMjAwKTtcblxuICAgICAgY3JlYXRlSG1hY1NweS5maXJzdENhbGwuY2FsbGVkV2l0aCgnc2hhMjU2JywgYWNjZXNzVG9rZW4pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB1cGRhdGVTcHkuZmlyc3RDYWxsLmNhbGxlZFdpdGgoc2lub24ubWF0Y2goJzMuMCcpKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgY3JlYXRlSG1hY1NweS5yZXN0b3JlKCk7XG4gICAgICB2ZXJpZnlSZXNwb25zZVN0dWIucmVzdG9yZSgpO1xuICAgICAgc2NvcGUuZG9uZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQXV0aCBWMicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRlZmF1bHQgdG8gYXV0aCB2ZXJzaW9uIDIgd2hlbiBpbml0aWFsaXppbmcgYSBiaXRnbyBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHbygpO1xuICAgICAgYml0Z28uZ2V0QXV0aFZlcnNpb24oKS5zaG91bGQuZXFsKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIFwiMi4wXCIgYXMgdGhlIGJpdGdvLWF1dGgtdmVyc2lvbiBoZWFkZXIgd2hlbiBhdXRoIHYyIGlzIGVuYWJsZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly9iaXRnby5pbnZhbGlkJztcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvKCk7XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gbm9jayh1cmwsIHtcbiAgICAgICAgcmVxaGVhZGVyczoge1xuICAgICAgICAgICdiaXRnby1hdXRoLXZlcnNpb24nOiAnMi4wJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAgIC5nZXQoJy8nKVxuICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgYXdhaXQgYml0Z28uZ2V0KHVybCkuc2hvdWxkLmV2ZW50dWFsbHkuaGF2ZS5wcm9wZXJ0eSgnc3RhdHVzJywgMjAwKTtcbiAgICAgIHNjb3BlLmRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==