1 | ;
|
2 |
|
3 | // Plugin for an authorization server
|
4 |
|
5 | var _ = require('underscore');
|
6 | var request = require('abacus-request');
|
7 | var cluster = require('abacus-cluster');
|
8 | var jwt = require('jsonwebtoken');
|
9 |
|
10 | var extend = _.extend;
|
11 | var omit = _.omit;
|
12 |
|
13 | // Mock the cluster module
|
14 | require.cache[require.resolve('abacus-cluster')].exports = extend(function (app) {
|
15 | return app;
|
16 | }, cluster);
|
17 |
|
18 | var authserver = require('..');
|
19 |
|
20 | // Setup the debug log
|
21 | var debug = require('abacus-debug')('abacus-authserver-plugin-test');
|
22 |
|
23 | describe('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 |