UNPKG

11.2 kBJavaScriptView Raw
1'use strict';
2
3// Plugin for an authorization server
4
5var _ = require('underscore');
6var request = require('abacus-request');
7var cluster = require('abacus-cluster');
8var jwt = require('jsonwebtoken');
9
10var extend = _.extend;
11var omit = _.omit;
12
13// Mock the cluster module
14require.cache[require.resolve('abacus-cluster')].exports = extend(function (app) {
15 return app;
16}, cluster);
17
18var authserver = require('..');
19
20// Setup the debug log
21var debug = require('abacus-debug')('abacus-authserver-plugin-test');
22
23describe('abacus-account-plugin', function () {
24
25 it('get OAuth bearer access token', function (done) {
26
27 var verifyAuthServer = function verifyAuthServer(secure, cb) {
28 debug('Starting Auth Server Plugin in %s mode', secure ? 'secure' : 'insecure');
29
30 if (secure === true) process.env.SECURED = 'true';
31
32 // Create an authorization server plugin application
33 var app = authserver();
34
35 // Listen on an ephemeral port
36 var server = app.listen(0);
37
38 debug('Auth Server Plugin started on port %d', server.address().port);
39
40 // Get authorization server access token endpoint
41 debug('Requesting /v2/info endpoint');
42 request.get(['http://localhost:', server.address().port, '/v2/info'].join(''), {
43 headers: {
44 'x-forwarded-proto': secure ? 'https' : 'http'
45 }
46 }, function (err, val) {
47 expect(err).to.equal(undefined);
48 expect(val.statusCode).to.equal(200);
49
50 debug('Info endpoint returned %o', val.body);
51
52 // Expect the access token endpoint to match the expectation
53 expect(val.body).to.deep.equal({
54 token_endpoint: [secure ? 'https' : 'http', '://localhost:', server.address().port].join('')
55 });
56
57 debug('Token endpoint is %s', val.body.token_endpoint);
58
59 // Get OAuth bearer access token with scopes using client credentials
60 debug('Fetching new token...');
61 request.get('http://localhost::p/oauth/token?' + 'grant_type=client_credentials&scope=' + encodeURIComponent('test.scope.write test.scope.read'), {
62 p: server.address().port
63 }, function (err, val) {
64 expect(err).to.equal(undefined);
65 expect(val.statusCode).to.equal(200);
66
67 debug('Got token response %o', val.body);
68
69 // Expect token information to match the expectation
70 expect(omit(val.body, 'access_token')).to.deep.equal({
71 token_type: 'bearer',
72 scope: 'test.scope.write test.scope.read',
73 expires_in: 43200
74 });
75
76 // Use JWT to verify the OAuth bearer access token
77 jwt.verify(val.body.access_token, process.env.JWTKEY || 'encode', {
78 algorithms: process.env.JWTALGO
79 });
80
81 // Use JWT to decode the access token and verify the scopes
82 expect(jwt.decode(val.body.access_token, {
83 complete: true
84 }).payload.scope).to.deep.equal(['test.scope.write', 'test.scope.read']);
85
86 debug('Token verified');
87
88 debug('Closing server');
89 server.close();
90 cb();
91 });
92 });
93 };
94
95 verifyAuthServer(false, function () {
96 return verifyAuthServer(true, done);
97 });
98 });
99});
100//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQSxJQUFNLElBQUksUUFBUSxZQUFSLENBQUo7QUFDTixJQUFNLFVBQVUsUUFBUSxnQkFBUixDQUFWO0FBQ04sSUFBTSxVQUFVLFFBQVEsZ0JBQVIsQ0FBVjtBQUNOLElBQU0sTUFBTSxRQUFRLGNBQVIsQ0FBTjs7QUFFTixJQUFNLFNBQVMsRUFBRSxNQUFGO0FBQ2YsSUFBTSxPQUFPLEVBQUUsSUFBRjs7O0FBR2IsUUFBUSxLQUFSLENBQWMsUUFBUSxPQUFSLENBQWdCLGdCQUFoQixDQUFkLEVBQWlELE9BQWpELEdBQ0UsT0FBTyxVQUFDLEdBQUQ7U0FBUztDQUFULEVBQWMsT0FBckIsQ0FERjs7QUFHQSxJQUFNLGFBQWEsUUFBUSxJQUFSLENBQWI7OztBQUdOLElBQU0sUUFBUSxRQUFRLGNBQVIsRUFBd0IsK0JBQXhCLENBQVI7O0FBRU4sU0FBUyx1QkFBVCxFQUFrQyxZQUFNOztBQUV0QyxLQUFHLCtCQUFILEVBQW9DLFVBQUMsSUFBRCxFQUFVOztBQUU1QyxRQUFNLG1CQUFtQixTQUFuQixnQkFBbUIsQ0FBQyxNQUFELEVBQVMsRUFBVCxFQUFnQjtBQUN2QyxZQUFNLHdDQUFOLEVBQ0UsU0FBUyxRQUFULEdBQW9CLFVBQXBCLENBREYsQ0FEdUM7O0FBSXZDLFVBQUksV0FBVyxJQUFYLEVBQ0YsUUFBUSxHQUFSLENBQVksT0FBWixHQUFzQixNQUF0QixDQURGOzs7QUFKdUMsVUFRakMsTUFBTSxZQUFOOzs7QUFSaUMsVUFXakMsU0FBUyxJQUFJLE1BQUosQ0FBVyxDQUFYLENBQVQsQ0FYaUM7O0FBYXZDLFlBQU0sdUNBQU4sRUFBK0MsT0FBTyxPQUFQLEdBQWlCLElBQWpCLENBQS9DOzs7QUFidUMsV0FnQnZDLENBQU0sOEJBQU4sRUFoQnVDO0FBaUJ2QyxjQUFRLEdBQVIsQ0FBWSxDQUNWLG1CQURVLEVBRVYsT0FBTyxPQUFQLEdBQWlCLElBQWpCLEVBQ0EsVUFIVSxFQUlWLElBSlUsQ0FJTCxFQUpLLENBQVosRUFJWTtBQUNWLGlCQUFTO0FBQ1AsK0JBQXFCLFNBQVMsT0FBVCxHQUFtQixNQUFuQjtTQUR2QjtPQUxGLEVBUUcsVUFBQyxHQUFELEVBQU0sR0FBTixFQUFjO0FBQ2YsZUFBTyxHQUFQLEVBQVksRUFBWixDQUFlLEtBQWYsQ0FBcUIsU0FBckIsRUFEZTtBQUVmLGVBQU8sSUFBSSxVQUFKLENBQVAsQ0FBdUIsRUFBdkIsQ0FBMEIsS0FBMUIsQ0FBZ0MsR0FBaEMsRUFGZTs7QUFJZixjQUFNLDJCQUFOLEVBQW1DLElBQUksSUFBSixDQUFuQzs7O0FBSmUsY0FPZixDQUFPLElBQUksSUFBSixDQUFQLENBQWlCLEVBQWpCLENBQW9CLElBQXBCLENBQXlCLEtBQXpCLENBQStCO0FBQzdCLDBCQUFnQixDQUNkLFNBQVMsT0FBVCxHQUFtQixNQUFuQixFQUNBLGVBRmMsRUFHZCxPQUFPLE9BQVAsR0FBaUIsSUFBakIsQ0FIYyxDQUlkLElBSmMsQ0FJVCxFQUpTLENBQWhCO1NBREYsRUFQZTs7QUFlZixjQUFNLHNCQUFOLEVBQThCLElBQUksSUFBSixDQUFTLGNBQVQsQ0FBOUI7OztBQWZlLGFBa0JmLENBQU0sdUJBQU4sRUFsQmU7QUFtQmYsZ0JBQVEsR0FBUixDQUFZLHFDQUNWLHNDQURVLEdBRVYsbUJBQW1CLGtDQUFuQixDQUZVLEVBRThDO0FBQ3RELGFBQUcsT0FBTyxPQUFQLEdBQWlCLElBQWpCO1NBSFAsRUFLRSxVQUFDLEdBQUQsRUFBTSxHQUFOLEVBQWM7QUFDWixpQkFBTyxHQUFQLEVBQVksRUFBWixDQUFlLEtBQWYsQ0FBcUIsU0FBckIsRUFEWTtBQUVaLGlCQUFPLElBQUksVUFBSixDQUFQLENBQXVCLEVBQXZCLENBQTBCLEtBQTFCLENBQWdDLEdBQWhDLEVBRlk7O0FBSVosZ0JBQU0sdUJBQU4sRUFBK0IsSUFBSSxJQUFKLENBQS9COzs7QUFKWSxnQkFPWixDQUFPLEtBQUssSUFBSSxJQUFKLEVBQVUsY0FBZixDQUFQLEVBQXVDLEVBQXZDLENBQTBDLElBQTFDLENBQStDLEtBQS9DLENBQXFEO0FBQ25ELHdCQUFZLFFBQVo7QUFDQSxtQkFBTyxrQ0FBUDtBQUNBLHdCQUFZLEtBQVo7V0FIRjs7O0FBUFksYUFjWixDQUFJLE1BQUosQ0FBVyxJQUFJLElBQUosQ0FBUyxZQUFULEVBQXVCLFFBQVEsR0FBUixDQUFZLE1BQVosSUFBc0IsUUFBdEIsRUFBZ0M7QUFDaEUsd0JBQVksUUFBUSxHQUFSLENBQVksT0FBWjtXQURkOzs7QUFkWSxnQkFtQlosQ0FBTyxJQUFJLE1BQUosQ0FBVyxJQUFJLElBQUosQ0FBUyxZQUFULEVBQXVCO0FBQ3ZDLHNCQUFVLElBQVY7V0FESyxFQUVKLE9BRkksQ0FFSSxLQUZKLENBQVAsQ0FFa0IsRUFGbEIsQ0FFcUIsSUFGckIsQ0FFMEIsS0FGMUIsQ0FFZ0MsQ0FBQyxrQkFBRCxFQUM5QixpQkFEOEIsQ0FGaEMsRUFuQlk7O0FBd0JaLGdCQUFNLGdCQUFOLEVBeEJZOztBQTBCWixnQkFBTSxnQkFBTixFQTFCWTtBQTJCWixpQkFBTyxLQUFQLEdBM0JZO0FBNEJaLGVBNUJZO1NBQWQsQ0FMRixDQW5CZTtPQUFkLENBUkgsQ0FqQnVDO0tBQWhCLENBRm1COztBQW9GNUMscUJBQWlCLEtBQWpCLEVBQXdCO2FBQU0saUJBQWlCLElBQWpCLEVBQXVCLElBQXZCO0tBQU4sQ0FBeEIsQ0FwRjRDO0dBQVYsQ0FBcEMsQ0FGc0M7Q0FBTixDQUFsQyIsImZpbGUiOiJ0ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBQbHVnaW4gZm9yIGFuIGF1dGhvcml6YXRpb24gc2VydmVyXG5cbmNvbnN0IF8gPSByZXF1aXJlKCd1bmRlcnNjb3JlJyk7XG5jb25zdCByZXF1ZXN0ID0gcmVxdWlyZSgnYWJhY3VzLXJlcXVlc3QnKTtcbmNvbnN0IGNsdXN0ZXIgPSByZXF1aXJlKCdhYmFjdXMtY2x1c3RlcicpO1xuY29uc3Qgand0ID0gcmVxdWlyZSgnanNvbndlYnRva2VuJyk7XG5cbmNvbnN0IGV4dGVuZCA9IF8uZXh0ZW5kO1xuY29uc3Qgb21pdCA9IF8ub21pdDtcblxuLy8gTW9jayB0aGUgY2x1c3RlciBtb2R1bGVcbnJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKCdhYmFjdXMtY2x1c3RlcicpXS5leHBvcnRzID1cbiAgZXh0ZW5kKChhcHApID0+IGFwcCwgY2x1c3Rlcik7XG5cbmNvbnN0IGF1dGhzZXJ2ZXIgPSByZXF1aXJlKCcuLicpO1xuXG4vLyBTZXR1cCB0aGUgZGVidWcgbG9nXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2FiYWN1cy1kZWJ1ZycpKCdhYmFjdXMtYXV0aHNlcnZlci1wbHVnaW4tdGVzdCcpO1xuXG5kZXNjcmliZSgnYWJhY3VzLWFjY291bnQtcGx1Z2luJywgKCkgPT4ge1xuXG4gIGl0KCdnZXQgT0F1dGggYmVhcmVyIGFjY2VzcyB0b2tlbicsIChkb25lKSA9PiB7XG5cbiAgICBjb25zdCB2ZXJpZnlBdXRoU2VydmVyID0gKHNlY3VyZSwgY2IpID0+IHtcbiAgICAgIGRlYnVnKCdTdGFydGluZyBBdXRoIFNlcnZlciBQbHVnaW4gaW4gJXMgbW9kZScsXG4gICAgICAgIHNlY3VyZSA/ICdzZWN1cmUnIDogJ2luc2VjdXJlJyk7XG5cbiAgICAgIGlmIChzZWN1cmUgPT09IHRydWUpXG4gICAgICAgIHByb2Nlc3MuZW52LlNFQ1VSRUQgPSAndHJ1ZSc7XG5cbiAgICAgIC8vIENyZWF0ZSBhbiBhdXRob3JpemF0aW9uIHNlcnZlciBwbHVnaW4gYXBwbGljYXRpb25cbiAgICAgIGNvbnN0IGFwcCA9IGF1dGhzZXJ2ZXIoKTtcblxuICAgICAgLy8gTGlzdGVuIG9uIGFuIGVwaGVtZXJhbCBwb3J0XG4gICAgICBjb25zdCBzZXJ2ZXIgPSBhcHAubGlzdGVuKDApO1xuXG4gICAgICBkZWJ1ZygnQXV0aCBTZXJ2ZXIgUGx1Z2luIHN0YXJ0ZWQgb24gcG9ydCAlZCcsIHNlcnZlci5hZGRyZXNzKCkucG9ydCk7XG5cbiAgICAgIC8vIEdldCBhdXRob3JpemF0aW9uIHNlcnZlciBhY2Nlc3MgdG9rZW4gZW5kcG9pbnRcbiAgICAgIGRlYnVnKCdSZXF1ZXN0aW5nIC92Mi9pbmZvIGVuZHBvaW50Jyk7XG4gICAgICByZXF1ZXN0LmdldChbXG4gICAgICAgICdodHRwOi8vbG9jYWxob3N0OicsXG4gICAgICAgIHNlcnZlci5hZGRyZXNzKCkucG9ydCxcbiAgICAgICAgJy92Mi9pbmZvJ1xuICAgICAgXS5qb2luKCcnKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ3gtZm9yd2FyZGVkLXByb3RvJzogc2VjdXJlID8gJ2h0dHBzJyA6ICdodHRwJ1xuICAgICAgICB9XG4gICAgICB9LCAoZXJyLCB2YWwpID0+IHtcbiAgICAgICAgZXhwZWN0KGVycikudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgICAgICAgZXhwZWN0KHZhbC5zdGF0dXNDb2RlKS50by5lcXVhbCgyMDApO1xuXG4gICAgICAgIGRlYnVnKCdJbmZvIGVuZHBvaW50IHJldHVybmVkICVvJywgdmFsLmJvZHkpO1xuXG4gICAgICAgIC8vIEV4cGVjdCB0aGUgYWNjZXNzIHRva2VuIGVuZHBvaW50IHRvIG1hdGNoIHRoZSBleHBlY3RhdGlvblxuICAgICAgICBleHBlY3QodmFsLmJvZHkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICAgIHRva2VuX2VuZHBvaW50OiBbXG4gICAgICAgICAgICBzZWN1cmUgPyAnaHR0cHMnIDogJ2h0dHAnLFxuICAgICAgICAgICAgJzovL2xvY2FsaG9zdDonLFxuICAgICAgICAgICAgc2VydmVyLmFkZHJlc3MoKS5wb3J0XG4gICAgICAgICAgXS5qb2luKCcnKVxuICAgICAgICB9KTtcblxuICAgICAgICBkZWJ1ZygnVG9rZW4gZW5kcG9pbnQgaXMgJXMnLCB2YWwuYm9keS50b2tlbl9lbmRwb2ludCk7XG5cbiAgICAgICAgLy8gR2V0IE9BdXRoIGJlYXJlciBhY2Nlc3MgdG9rZW4gd2l0aCBzY29wZXMgdXNpbmcgY2xpZW50IGNyZWRlbnRpYWxzXG4gICAgICAgIGRlYnVnKCdGZXRjaGluZyBuZXcgdG9rZW4uLi4nKTtcbiAgICAgICAgcmVxdWVzdC5nZXQoJ2h0dHA6Ly9sb2NhbGhvc3Q6OnAvb2F1dGgvdG9rZW4/JyArXG4gICAgICAgICAgJ2dyYW50X3R5cGU9Y2xpZW50X2NyZWRlbnRpYWxzJnNjb3BlPScgK1xuICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCgndGVzdC5zY29wZS53cml0ZSB0ZXN0LnNjb3BlLnJlYWQnKSwge1xuICAgICAgICAgICAgcDogc2VydmVyLmFkZHJlc3MoKS5wb3J0XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyLCB2YWwpID0+IHtcbiAgICAgICAgICAgIGV4cGVjdChlcnIpLnRvLmVxdWFsKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBleHBlY3QodmFsLnN0YXR1c0NvZGUpLnRvLmVxdWFsKDIwMCk7XG5cbiAgICAgICAgICAgIGRlYnVnKCdHb3QgdG9rZW4gcmVzcG9uc2UgJW8nLCB2YWwuYm9keSk7XG5cbiAgICAgICAgICAgIC8vIEV4cGVjdCB0b2tlbiBpbmZvcm1hdGlvbiB0byBtYXRjaCB0aGUgZXhwZWN0YXRpb25cbiAgICAgICAgICAgIGV4cGVjdChvbWl0KHZhbC5ib2R5LCAnYWNjZXNzX3Rva2VuJykpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICAgICAgICB0b2tlbl90eXBlOiAnYmVhcmVyJyxcbiAgICAgICAgICAgICAgc2NvcGU6ICd0ZXN0LnNjb3BlLndyaXRlIHRlc3Quc2NvcGUucmVhZCcsXG4gICAgICAgICAgICAgIGV4cGlyZXNfaW46IDQzMjAwXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gVXNlIEpXVCB0byB2ZXJpZnkgdGhlIE9BdXRoIGJlYXJlciBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICAgIGp3dC52ZXJpZnkodmFsLmJvZHkuYWNjZXNzX3Rva2VuLCBwcm9jZXNzLmVudi5KV1RLRVkgfHwgJ2VuY29kZScsIHtcbiAgICAgICAgICAgICAgYWxnb3JpdGhtczogcHJvY2Vzcy5lbnYuSldUQUxHT1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFVzZSBKV1QgdG8gZGVjb2RlIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIHZlcmlmeSB0aGUgc2NvcGVzXG4gICAgICAgICAgICBleHBlY3Qoand0LmRlY29kZSh2YWwuYm9keS5hY2Nlc3NfdG9rZW4sIHtcbiAgICAgICAgICAgICAgY29tcGxldGU6IHRydWVcbiAgICAgICAgICAgIH0pLnBheWxvYWQuc2NvcGUpLnRvLmRlZXAuZXF1YWwoWyd0ZXN0LnNjb3BlLndyaXRlJyxcbiAgICAgICAgICAgICAgJ3Rlc3Quc2NvcGUucmVhZCddKTtcblxuICAgICAgICAgICAgZGVidWcoJ1Rva2VuIHZlcmlmaWVkJyk7XG5cbiAgICAgICAgICAgIGRlYnVnKCdDbG9zaW5nIHNlcnZlcicpO1xuICAgICAgICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZlcmlmeUF1dGhTZXJ2ZXIoZmFsc2UsICgpID0+IHZlcmlmeUF1dGhTZXJ2ZXIodHJ1ZSwgZG9uZSkpO1xuICB9KTtcbn0pO1xuIl19
\No newline at end of file