@webex/plugin-authorization-browser-first-party 2.59.3-next.1 → 2.59.4-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +6 -6
- package/README.md +53 -53
- package/babel.config.js +3 -3
- package/dist/authorization.js +92 -94
- package/dist/authorization.js.map +1 -1
- package/dist/config.js +8 -8
- package/dist/config.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/jest.config.js +3 -3
- package/package.json +13 -13
- package/process +1 -1
- package/src/authorization.js +347 -347
- package/src/config.js +38 -38
- package/src/index.js +18 -18
- package/test/automation/fixtures/app.js +60 -60
- package/test/automation/fixtures/index.html +24 -24
- package/test/automation/spec/authorization-code-grant.js +151 -151
- package/test/unit/spec/authorization.js +438 -438
package/.eslintrc.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const config = {
|
|
2
|
-
root: true,
|
|
3
|
-
extends: ['@webex/eslint-config-legacy'],
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
module.exports = config;
|
|
1
|
+
const config = {
|
|
2
|
+
root: true,
|
|
3
|
+
extends: ['@webex/eslint-config-legacy'],
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
module.exports = config;
|
package/README.md
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
# @webex/plugin-authorization-browser-first-party
|
|
2
|
-
|
|
3
|
-
[](https://github.com/RichardLitt/standard-readme)
|
|
4
|
-
|
|
5
|
-
> Authorization plugin used by the Cisco Webex Client
|
|
6
|
-
|
|
7
|
-
- [Install](#install)
|
|
8
|
-
- [Usage](#usage)
|
|
9
|
-
- [Contribute](#contribute)
|
|
10
|
-
- [Maintainers](#maintainers)
|
|
11
|
-
- [License](#license)
|
|
12
|
-
|
|
13
|
-
## Install
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
npm install --save @webex/plugin-authorization-browser-first-party
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Usage
|
|
20
|
-
|
|
21
|
-
This is a plugin for the Cisco Webex JS SDK . Please see our [developer portal](https://developer.webex.com/) and the [API docs](https://webex.github.io/webex-js-sdk/api/) for full details.
|
|
22
|
-
|
|
23
|
-
## Install
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
npm install --save @webex/plugin-authorization-browser-first-party
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Usage
|
|
30
|
-
|
|
31
|
-
```js
|
|
32
|
-
|
|
33
|
-
const Webex = require('webex');
|
|
34
|
-
|
|
35
|
-
const webex = Webex.init();
|
|
36
|
-
webex.authorization-browser-first-party.get(id)
|
|
37
|
-
.then((authorization-browser-first-party) => {
|
|
38
|
-
console.log(authorization-browser-first-party);
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Maintainers
|
|
44
|
-
|
|
45
|
-
This package is maintained by [Cisco Webex for Developers](https://developer.webex.com/).
|
|
46
|
-
|
|
47
|
-
## Contribute
|
|
48
|
-
|
|
49
|
-
Pull requests welcome. Please see [CONTRIBUTING.md](https://github.com/webex/webex-js-sdk/blob/master/CONTRIBUTING.md) for more details.
|
|
50
|
-
|
|
51
|
-
## License
|
|
52
|
-
|
|
53
|
-
© 2016-2020 Cisco and/or its affiliates. All Rights Reserved.
|
|
1
|
+
# @webex/plugin-authorization-browser-first-party
|
|
2
|
+
|
|
3
|
+
[](https://github.com/RichardLitt/standard-readme)
|
|
4
|
+
|
|
5
|
+
> Authorization plugin used by the Cisco Webex Client
|
|
6
|
+
|
|
7
|
+
- [Install](#install)
|
|
8
|
+
- [Usage](#usage)
|
|
9
|
+
- [Contribute](#contribute)
|
|
10
|
+
- [Maintainers](#maintainers)
|
|
11
|
+
- [License](#license)
|
|
12
|
+
|
|
13
|
+
## Install
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install --save @webex/plugin-authorization-browser-first-party
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
This is a plugin for the Cisco Webex JS SDK . Please see our [developer portal](https://developer.webex.com/) and the [API docs](https://webex.github.io/webex-js-sdk/api/) for full details.
|
|
22
|
+
|
|
23
|
+
## Install
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install --save @webex/plugin-authorization-browser-first-party
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```js
|
|
32
|
+
|
|
33
|
+
const Webex = require('webex');
|
|
34
|
+
|
|
35
|
+
const webex = Webex.init();
|
|
36
|
+
webex.authorization-browser-first-party.get(id)
|
|
37
|
+
.then((authorization-browser-first-party) => {
|
|
38
|
+
console.log(authorization-browser-first-party);
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Maintainers
|
|
44
|
+
|
|
45
|
+
This package is maintained by [Cisco Webex for Developers](https://developer.webex.com/).
|
|
46
|
+
|
|
47
|
+
## Contribute
|
|
48
|
+
|
|
49
|
+
Pull requests welcome. Please see [CONTRIBUTING.md](https://github.com/webex/webex-js-sdk/blob/master/CONTRIBUTING.md) for more details.
|
|
50
|
+
|
|
51
|
+
## License
|
|
52
|
+
|
|
53
|
+
© 2016-2020 Cisco and/or its affiliates. All Rights Reserved.
|
package/babel.config.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const babelConfigLegacy = require('@webex/babel-config-legacy');
|
|
2
|
-
|
|
3
|
-
module.exports = babelConfigLegacy;
|
|
1
|
+
const babelConfigLegacy = require('@webex/babel-config-legacy');
|
|
2
|
+
|
|
3
|
+
module.exports = babelConfigLegacy;
|
package/dist/authorization.js
CHANGED
|
@@ -13,13 +13,11 @@ var _deleteProperty = _interopRequireDefault(require("@babel/runtime-corejs2/cor
|
|
|
13
13
|
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
14
14
|
var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor"));
|
|
15
15
|
var _applyDecoratedDescriptor2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/applyDecoratedDescriptor"));
|
|
16
|
-
var _omit2 = _interopRequireDefault(require("lodash/omit"));
|
|
17
|
-
var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
|
|
18
|
-
var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
19
16
|
var _querystring = _interopRequireDefault(require("querystring"));
|
|
20
17
|
var _url = _interopRequireDefault(require("url"));
|
|
21
18
|
var _common = require("@webex/common");
|
|
22
19
|
var _webexCore = require("@webex/webex-core");
|
|
20
|
+
var _lodash = require("lodash");
|
|
23
21
|
var _uuid = _interopRequireDefault(require("uuid"));
|
|
24
22
|
var _encBase64url = _interopRequireDefault(require("crypto-js/enc-base64url"));
|
|
25
23
|
var _cryptoJs = _interopRequireDefault(require("crypto-js"));
|
|
@@ -30,23 +28,23 @@ var lodash = require('lodash');
|
|
|
30
28
|
var OAUTH2_CSRF_TOKEN = 'oauth2-csrf-token';
|
|
31
29
|
var OAUTH2_CODE_VERIFIER = 'oauth2-code-verifier';
|
|
32
30
|
|
|
33
|
-
/**
|
|
34
|
-
* Browser support for OAuth2. Automatically parses the URL query for an
|
|
35
|
-
* authorization code
|
|
36
|
-
*
|
|
37
|
-
* Use of this plugin for anything other than the Webex Web Client is strongly
|
|
38
|
-
* discouraged and may be broken at any time
|
|
39
|
-
* @class
|
|
40
|
-
* @name AuthorizationBrowserFirstParty
|
|
41
|
-
* @private
|
|
31
|
+
/**
|
|
32
|
+
* Browser support for OAuth2. Automatically parses the URL query for an
|
|
33
|
+
* authorization code
|
|
34
|
+
*
|
|
35
|
+
* Use of this plugin for anything other than the Webex Web Client is strongly
|
|
36
|
+
* discouraged and may be broken at any time
|
|
37
|
+
* @class
|
|
38
|
+
* @name AuthorizationBrowserFirstParty
|
|
39
|
+
* @private
|
|
42
40
|
*/
|
|
43
41
|
var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFlight)('isAuthorizing'), _dec2 = (0, _common.whileInFlight)('isAuthorizing'), (_obj = {
|
|
44
42
|
derived: {
|
|
45
|
-
/**
|
|
46
|
-
* Alias of {@link AuthorizationBrowserFirstParty#isAuthorizing}
|
|
47
|
-
* @instance
|
|
48
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
49
|
-
* @type {boolean}
|
|
43
|
+
/**
|
|
44
|
+
* Alias of {@link AuthorizationBrowserFirstParty#isAuthorizing}
|
|
45
|
+
* @instance
|
|
46
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
47
|
+
* @type {boolean}
|
|
50
48
|
*/
|
|
51
49
|
isAuthenticating: {
|
|
52
50
|
deps: ['isAuthorizing'],
|
|
@@ -56,11 +54,11 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
56
54
|
}
|
|
57
55
|
},
|
|
58
56
|
session: {
|
|
59
|
-
/**
|
|
60
|
-
* Indicates if an Authorization Code exchange is inflight
|
|
61
|
-
* @instance
|
|
62
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
63
|
-
* @type {boolean}
|
|
57
|
+
/**
|
|
58
|
+
* Indicates if an Authorization Code exchange is inflight
|
|
59
|
+
* @instance
|
|
60
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
61
|
+
* @type {boolean}
|
|
64
62
|
*/
|
|
65
63
|
isAuthorizing: {
|
|
66
64
|
default: false,
|
|
@@ -72,12 +70,12 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
72
70
|
}
|
|
73
71
|
},
|
|
74
72
|
namespace: 'Credentials',
|
|
75
|
-
/**
|
|
76
|
-
* Initializer
|
|
77
|
-
* @instance
|
|
78
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
79
|
-
* @private
|
|
80
|
-
* @returns {Authorization}
|
|
73
|
+
/**
|
|
74
|
+
* Initializer
|
|
75
|
+
* @instance
|
|
76
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
77
|
+
* @private
|
|
78
|
+
* @returns {Authorization}
|
|
81
79
|
*/
|
|
82
80
|
// eslint-disable-next-line complexity
|
|
83
81
|
initialize: function initialize() {
|
|
@@ -121,16 +119,16 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
121
119
|
});
|
|
122
120
|
return ret;
|
|
123
121
|
},
|
|
124
|
-
/**
|
|
125
|
-
* Kicks off an oauth flow
|
|
126
|
-
* @instance
|
|
127
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
128
|
-
* @param {Object} options
|
|
129
|
-
* @returns {Promise}
|
|
122
|
+
/**
|
|
123
|
+
* Kicks off an oauth flow
|
|
124
|
+
* @instance
|
|
125
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
126
|
+
* @param {Object} options
|
|
127
|
+
* @returns {Promise}
|
|
130
128
|
*/
|
|
131
129
|
initiateLogin: function initiateLogin() {
|
|
132
130
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
133
|
-
options = (0,
|
|
131
|
+
options = (0, _lodash.cloneDeep)(options);
|
|
134
132
|
if (options.email) {
|
|
135
133
|
options.emailHash = _cryptoJs.default.SHA256(options.email).toString();
|
|
136
134
|
}
|
|
@@ -143,13 +141,13 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
143
141
|
options.code_challenge_method = 'S256';
|
|
144
142
|
return this.initiateAuthorizationCodeGrant(options);
|
|
145
143
|
},
|
|
146
|
-
/**
|
|
147
|
-
* Kicks off the Implicit Code grant flow. Typically called via
|
|
148
|
-
* {@link AuthorizationBrowserFirstParty#initiateLogin}
|
|
149
|
-
* @instance
|
|
150
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
151
|
-
* @param {Object} options
|
|
152
|
-
* @returns {Promise}
|
|
144
|
+
/**
|
|
145
|
+
* Kicks off the Implicit Code grant flow. Typically called via
|
|
146
|
+
* {@link AuthorizationBrowserFirstParty#initiateLogin}
|
|
147
|
+
* @instance
|
|
148
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
149
|
+
* @param {Object} options
|
|
150
|
+
* @returns {Promise}
|
|
153
151
|
*/
|
|
154
152
|
initiateAuthorizationCodeGrant: function initiateAuthorizationCodeGrant(options) {
|
|
155
153
|
this.logger.info('authorization: initiating authorization code grant flow');
|
|
@@ -158,13 +156,13 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
158
156
|
}, options));
|
|
159
157
|
return _promise.default.resolve();
|
|
160
158
|
},
|
|
161
|
-
/**
|
|
162
|
-
* Called by {@link WebexCore#logout()}. Redirects to the logout page
|
|
163
|
-
* @instance
|
|
164
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
165
|
-
* @param {Object} options
|
|
166
|
-
* @param {boolean} options.noRedirect if true, does not redirect
|
|
167
|
-
* @returns {Promise}
|
|
159
|
+
/**
|
|
160
|
+
* Called by {@link WebexCore#logout()}. Redirects to the logout page
|
|
161
|
+
* @instance
|
|
162
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
163
|
+
* @param {Object} options
|
|
164
|
+
* @param {boolean} options.noRedirect if true, does not redirect
|
|
165
|
+
* @returns {Promise}
|
|
168
166
|
*/
|
|
169
167
|
logout: function logout() {
|
|
170
168
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
@@ -172,13 +170,13 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
172
170
|
this.webex.getWindow().location = this.webex.credentials.buildLogoutUrl(options);
|
|
173
171
|
}
|
|
174
172
|
},
|
|
175
|
-
/**
|
|
176
|
-
* Exchanges an authorization code for an access token
|
|
177
|
-
* @instance
|
|
178
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
179
|
-
* @param {Object} options
|
|
180
|
-
* @param {Object} options.code
|
|
181
|
-
* @returns {Promise}
|
|
173
|
+
/**
|
|
174
|
+
* Exchanges an authorization code for an access token
|
|
175
|
+
* @instance
|
|
176
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
177
|
+
* @param {Object} options
|
|
178
|
+
* @param {Object} options.code
|
|
179
|
+
* @returns {Promise}
|
|
182
180
|
*/
|
|
183
181
|
requestAuthorizationCodeGrant: function requestAuthorizationCodeGrant() {
|
|
184
182
|
var _this2 = this;
|
|
@@ -218,13 +216,13 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
218
216
|
return _promise.default.reject(new ErrorConstructor(res._res || res));
|
|
219
217
|
});
|
|
220
218
|
},
|
|
221
|
-
/**
|
|
222
|
-
* Checks if the result of the login redirect contains an error string
|
|
223
|
-
* @instance
|
|
224
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
225
|
-
* @param {Object} location
|
|
226
|
-
* @private
|
|
227
|
-
* @returns {Promise}
|
|
219
|
+
/**
|
|
220
|
+
* Checks if the result of the login redirect contains an error string
|
|
221
|
+
* @instance
|
|
222
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
223
|
+
* @param {Object} location
|
|
224
|
+
* @private
|
|
225
|
+
* @returns {Promise}
|
|
228
226
|
*/
|
|
229
227
|
_checkForErrors: function _checkForErrors(location) {
|
|
230
228
|
var query = location.query;
|
|
@@ -233,34 +231,34 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
233
231
|
throw new ErrorConstructor(query);
|
|
234
232
|
}
|
|
235
233
|
},
|
|
236
|
-
/**
|
|
237
|
-
* Removes no-longer needed values from the url (access token, csrf token, etc)
|
|
238
|
-
* @instance
|
|
239
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
240
|
-
* @param {Object} location
|
|
241
|
-
* @private
|
|
242
|
-
* @returns {Promise}
|
|
234
|
+
/**
|
|
235
|
+
* Removes no-longer needed values from the url (access token, csrf token, etc)
|
|
236
|
+
* @instance
|
|
237
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
238
|
+
* @param {Object} location
|
|
239
|
+
* @private
|
|
240
|
+
* @returns {Promise}
|
|
243
241
|
*/
|
|
244
242
|
_cleanUrl: function _cleanUrl(location) {
|
|
245
|
-
location = (0,
|
|
243
|
+
location = (0, _lodash.cloneDeep)(location);
|
|
246
244
|
if (this.webex.getWindow().history && this.webex.getWindow().history.replaceState) {
|
|
247
245
|
(0, _deleteProperty.default)(location.query, 'code');
|
|
248
|
-
if ((0,
|
|
246
|
+
if ((0, _lodash.isEmpty)((0, _lodash.omit)(location.query.state, 'csrf_token'))) {
|
|
249
247
|
(0, _deleteProperty.default)(location.query, 'state');
|
|
250
248
|
} else {
|
|
251
|
-
location.query.state = _common.base64.encode((0, _stringify.default)((0,
|
|
249
|
+
location.query.state = _common.base64.encode((0, _stringify.default)((0, _lodash.omit)(location.query.state, 'csrf_token')));
|
|
252
250
|
}
|
|
253
251
|
location.search = _querystring.default.stringify(location.query);
|
|
254
252
|
(0, _deleteProperty.default)(location, 'query');
|
|
255
253
|
this.webex.getWindow().history.replaceState({}, null, _url.default.format(location));
|
|
256
254
|
}
|
|
257
255
|
},
|
|
258
|
-
/**
|
|
259
|
-
* Generates PKCE code verifier and code challenge and sets the the code verifier in sessionStorage
|
|
260
|
-
* @instance
|
|
261
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
262
|
-
* @private
|
|
263
|
-
* @returns {string}
|
|
256
|
+
/**
|
|
257
|
+
* Generates PKCE code verifier and code challenge and sets the the code verifier in sessionStorage
|
|
258
|
+
* @instance
|
|
259
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
260
|
+
* @private
|
|
261
|
+
* @returns {string}
|
|
264
262
|
*/
|
|
265
263
|
_generateCodeChallenge: function _generateCodeChallenge() {
|
|
266
264
|
this.logger.info('authorization: generating PKCE code challenge');
|
|
@@ -274,12 +272,12 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
274
272
|
this.webex.getWindow().sessionStorage.setItem(OAUTH2_CODE_VERIFIER, codeVerifier);
|
|
275
273
|
return codeChallenge;
|
|
276
274
|
},
|
|
277
|
-
/**
|
|
278
|
-
* Generates a CSRF token and sticks in in sessionStorage
|
|
279
|
-
* @instance
|
|
280
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
281
|
-
* @private
|
|
282
|
-
* @returns {Promise}
|
|
275
|
+
/**
|
|
276
|
+
* Generates a CSRF token and sticks in in sessionStorage
|
|
277
|
+
* @instance
|
|
278
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
279
|
+
* @private
|
|
280
|
+
* @returns {Promise}
|
|
283
281
|
*/
|
|
284
282
|
_generateSecurityToken: function _generateSecurityToken() {
|
|
285
283
|
this.logger.info('authorization: generating csrf token');
|
|
@@ -287,14 +285,14 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
287
285
|
this.webex.getWindow().sessionStorage.setItem('oauth2-csrf-token', token);
|
|
288
286
|
return token;
|
|
289
287
|
},
|
|
290
|
-
/**
|
|
291
|
-
* Checks if the CSRF token in sessionStorage is the same as the one returned
|
|
292
|
-
* in the url.
|
|
293
|
-
* @instance
|
|
294
|
-
* @memberof AuthorizationBrowserFirstParty
|
|
295
|
-
* @param {Object} query
|
|
296
|
-
* @private
|
|
297
|
-
* @returns {Promise}
|
|
288
|
+
/**
|
|
289
|
+
* Checks if the CSRF token in sessionStorage is the same as the one returned
|
|
290
|
+
* in the url.
|
|
291
|
+
* @instance
|
|
292
|
+
* @memberof AuthorizationBrowserFirstParty
|
|
293
|
+
* @param {Object} query
|
|
294
|
+
* @private
|
|
295
|
+
* @returns {Promise}
|
|
298
296
|
*/
|
|
299
297
|
_verifySecurityToken: function _verifySecurityToken(query) {
|
|
300
298
|
var sessionToken = this.webex.getWindow().sessionStorage.getItem(OAUTH2_CSRF_TOKEN);
|
|
@@ -313,7 +311,7 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
|
|
|
313
311
|
throw new Error("CSRF token ".concat(token, " does not match stored token ").concat(sessionToken));
|
|
314
312
|
}
|
|
315
313
|
},
|
|
316
|
-
version: "2.59.
|
|
314
|
+
version: "2.59.4-next.1"
|
|
317
315
|
}, ((0, _applyDecoratedDescriptor2.default)(_obj, "initiateAuthorizationCodeGrant", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "initiateAuthorizationCodeGrant"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "requestAuthorizationCodeGrant", [_dec2, _common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "requestAuthorizationCodeGrant"), _obj)), _obj)));
|
|
318
316
|
var _default = Authorization;
|
|
319
317
|
exports.default = _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_querystring","_interopRequireDefault","require","_url","_common","_webexCore","_uuid","_encBase64url","_cryptoJs","_dec","_dec2","_obj","lodash","OAUTH2_CSRF_TOKEN","OAUTH2_CODE_VERIFIER","Authorization","WebexPlugin","extend","whileInFlight","derived","isAuthenticating","deps","fn","isAuthorizing","session","default","type","ready","namespace","initialize","_this","_len","arguments","length","attrs","Array","_key","ret","_apply","prototype","location","url","parse","webex","getWindow","href","_checkForErrors","code","query","state","JSON","base64","decode","codeVerifier","sessionStorage","getItem","removeItem","emailhash","_verifySecurityToken","_cleanUrl","process","nextTick","internal","services","collectPreauthCatalog","catch","_promise","resolve","then","requestAuthorizationCodeGrant","initiateLogin","options","undefined","_cloneDeep2","email","emailHash","CryptoJS","SHA256","toString","csrf_token","_generateSecurityToken","code_challenge","_generateCodeChallenge","code_challenge_method","initiateAuthorizationCodeGrant","logger","info","credentials","buildLoginUrl","_assign","response_type","logout","noRedirect","buildLogoutUrl","_this2","reject","Error","form","grant_type","redirect_uri","config","self_contained_token","code_verifier","request","method","uri","tokenUrl","auth","user","client_id","pass","client_secret","sendImmediately","shouldRefreshAccessToken","res","set","supertoken","body","statusCode","ErrorConstructor","grantErrors","select","error","_res","history","replaceState","_deleteProperty","_isEmpty2","_omit2","encode","_stringify","search","querystring","stringify","format","safeCharacterMap","base64url","_safe_map","times","random","join","codeChallenge","setItem","token","uuid","v4","sessionToken","concat","version","_applyDecoratedDescriptor2","_getOwnPropertyDescriptor","oneFlight","_default","exports"],"sources":["authorization.js"],"sourcesContent":["/*!\r\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\r\n */\r\n\r\n/* eslint camelcase: [0] */\r\n\r\nimport querystring from 'querystring';\r\nimport url from 'url';\r\n\r\nimport {base64, oneFlight, whileInFlight} from '@webex/common';\r\nimport {grantErrors, WebexPlugin} from '@webex/webex-core';\r\nimport {cloneDeep, isEmpty, omit} from 'lodash';\r\nimport uuid from 'uuid';\r\nimport base64url from 'crypto-js/enc-base64url';\r\nimport CryptoJS from 'crypto-js';\r\n\r\n// Necessary to require lodash this way in order to stub\r\n// methods in the unit test\r\nconst lodash = require('lodash');\r\n\r\nconst OAUTH2_CSRF_TOKEN = 'oauth2-csrf-token';\r\nconst OAUTH2_CODE_VERIFIER = 'oauth2-code-verifier';\r\n\r\n/**\r\n * Browser support for OAuth2. Automatically parses the URL query for an\r\n * authorization code\r\n *\r\n * Use of this plugin for anything other than the Webex Web Client is strongly\r\n * discouraged and may be broken at any time\r\n * @class\r\n * @name AuthorizationBrowserFirstParty\r\n * @private\r\n */\r\nconst Authorization = WebexPlugin.extend({\r\n derived: {\r\n /**\r\n * Alias of {@link AuthorizationBrowserFirstParty#isAuthorizing}\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @type {boolean}\r\n */\r\n isAuthenticating: {\r\n deps: ['isAuthorizing'],\r\n fn() {\r\n return this.isAuthorizing;\r\n },\r\n },\r\n },\r\n\r\n session: {\r\n /**\r\n * Indicates if an Authorization Code exchange is inflight\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @type {boolean}\r\n */\r\n isAuthorizing: {\r\n default: false,\r\n type: 'boolean',\r\n },\r\n ready: {\r\n default: false,\r\n type: 'boolean',\r\n },\r\n },\r\n\r\n namespace: 'Credentials',\r\n\r\n /**\r\n * Initializer\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @private\r\n * @returns {Authorization}\r\n */\r\n // eslint-disable-next-line complexity\r\n initialize(...attrs) {\r\n const ret = Reflect.apply(WebexPlugin.prototype.initialize, this, attrs);\r\n const location = url.parse(this.webex.getWindow().location.href, true);\r\n\r\n this._checkForErrors(location);\r\n\r\n const {code} = location.query;\r\n\r\n if (!code) {\r\n this.ready = true;\r\n\r\n return ret;\r\n }\r\n\r\n if (location.query.state) {\r\n location.query.state = JSON.parse(base64.decode(location.query.state));\r\n } else {\r\n location.query.state = {};\r\n }\r\n\r\n const codeVerifier = this.webex.getWindow().sessionStorage.getItem(OAUTH2_CODE_VERIFIER);\r\n\r\n this.webex.getWindow().sessionStorage.removeItem(OAUTH2_CODE_VERIFIER);\r\n\r\n const {emailhash} = location.query.state;\r\n\r\n this._verifySecurityToken(location.query);\r\n this._cleanUrl(location);\r\n\r\n // Wait until nextTick in case `credentials` hasn't initialized yet\r\n process.nextTick(() => {\r\n this.webex.internal.services\r\n .collectPreauthCatalog({emailhash})\r\n .catch(() => Promise.resolve())\r\n .then(() => this.requestAuthorizationCodeGrant({code, codeVerifier}))\r\n .then(() => {\r\n this.ready = true;\r\n });\r\n });\r\n\r\n return ret;\r\n },\r\n\r\n /**\r\n * Kicks off an oauth flow\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} options\r\n * @returns {Promise}\r\n */\r\n initiateLogin(options = {}) {\r\n options = cloneDeep(options);\r\n if (options.email) {\r\n options.emailHash = CryptoJS.SHA256(options.email).toString();\r\n }\r\n delete options.email;\r\n options.state = options.state || {};\r\n options.state.csrf_token = this._generateSecurityToken();\r\n // catalog uses emailhash and redirectCI uses emailHash\r\n options.state.emailhash = options.emailHash;\r\n\r\n options.code_challenge = this._generateCodeChallenge();\r\n options.code_challenge_method = 'S256';\r\n\r\n return this.initiateAuthorizationCodeGrant(options);\r\n },\r\n\r\n @whileInFlight('isAuthorizing')\r\n /**\r\n * Kicks off the Implicit Code grant flow. Typically called via\r\n * {@link AuthorizationBrowserFirstParty#initiateLogin}\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} options\r\n * @returns {Promise}\r\n */\r\n initiateAuthorizationCodeGrant(options) {\r\n this.logger.info('authorization: initiating authorization code grant flow');\r\n this.webex.getWindow().location = this.webex.credentials.buildLoginUrl(\r\n Object.assign({response_type: 'code'}, options)\r\n );\r\n\r\n return Promise.resolve();\r\n },\r\n\r\n /**\r\n * Called by {@link WebexCore#logout()}. Redirects to the logout page\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} options\r\n * @param {boolean} options.noRedirect if true, does not redirect\r\n * @returns {Promise}\r\n */\r\n logout(options = {}) {\r\n if (!options.noRedirect) {\r\n this.webex.getWindow().location = this.webex.credentials.buildLogoutUrl(options);\r\n }\r\n },\r\n\r\n @whileInFlight('isAuthorizing')\r\n @oneFlight\r\n /**\r\n * Exchanges an authorization code for an access token\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} options\r\n * @param {Object} options.code\r\n * @returns {Promise}\r\n */\r\n requestAuthorizationCodeGrant(options = {}) {\r\n this.logger.info('credentials: requesting authorization code grant');\r\n\r\n if (!options.code) {\r\n return Promise.reject(new Error('`options.code` is required'));\r\n }\r\n\r\n const form = {\r\n grant_type: 'authorization_code',\r\n redirect_uri: this.config.redirect_uri,\r\n code: options.code,\r\n self_contained_token: true,\r\n };\r\n\r\n if (options.codeVerifier) {\r\n form.code_verifier = options.codeVerifier;\r\n }\r\n\r\n return this.webex\r\n .request({\r\n method: 'POST',\r\n uri: this.config.tokenUrl,\r\n form,\r\n auth: {\r\n user: this.config.client_id,\r\n pass: this.config.client_secret,\r\n sendImmediately: true,\r\n },\r\n shouldRefreshAccessToken: false,\r\n })\r\n .then((res) => {\r\n this.webex.credentials.set({supertoken: res.body});\r\n })\r\n .catch((res) => {\r\n if (res.statusCode !== 400) {\r\n return Promise.reject(res);\r\n }\r\n\r\n const ErrorConstructor = grantErrors.select(res.body.error);\r\n\r\n return Promise.reject(new ErrorConstructor(res._res || res));\r\n });\r\n },\r\n\r\n /**\r\n * Checks if the result of the login redirect contains an error string\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} location\r\n * @private\r\n * @returns {Promise}\r\n */\r\n _checkForErrors(location) {\r\n const {query} = location;\r\n\r\n if (query && query.error) {\r\n const ErrorConstructor = grantErrors.select(query.error);\r\n\r\n throw new ErrorConstructor(query);\r\n }\r\n },\r\n\r\n /**\r\n * Removes no-longer needed values from the url (access token, csrf token, etc)\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} location\r\n * @private\r\n * @returns {Promise}\r\n */\r\n _cleanUrl(location) {\r\n location = cloneDeep(location);\r\n if (this.webex.getWindow().history && this.webex.getWindow().history.replaceState) {\r\n Reflect.deleteProperty(location.query, 'code');\r\n if (isEmpty(omit(location.query.state, 'csrf_token'))) {\r\n Reflect.deleteProperty(location.query, 'state');\r\n } else {\r\n location.query.state = base64.encode(\r\n JSON.stringify(omit(location.query.state, 'csrf_token'))\r\n );\r\n }\r\n location.search = querystring.stringify(location.query);\r\n Reflect.deleteProperty(location, 'query');\r\n this.webex.getWindow().history.replaceState({}, null, url.format(location));\r\n }\r\n },\r\n\r\n /**\r\n * Generates PKCE code verifier and code challenge and sets the the code verifier in sessionStorage\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @private\r\n * @returns {string}\r\n */\r\n _generateCodeChallenge() {\r\n this.logger.info('authorization: generating PKCE code challenge');\r\n\r\n // eslint-disable-next-line no-underscore-dangle\r\n const safeCharacterMap = base64url._safe_map;\r\n\r\n const codeVerifier = lodash\r\n .times(128, () => safeCharacterMap[lodash.random(0, safeCharacterMap.length - 1)])\r\n .join('');\r\n\r\n const codeChallenge = CryptoJS.SHA256(codeVerifier).toString(base64url);\r\n\r\n this.webex.getWindow().sessionStorage.setItem(OAUTH2_CODE_VERIFIER, codeVerifier);\r\n\r\n return codeChallenge;\r\n },\r\n\r\n /**\r\n * Generates a CSRF token and sticks in in sessionStorage\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @private\r\n * @returns {Promise}\r\n */\r\n _generateSecurityToken() {\r\n this.logger.info('authorization: generating csrf token');\r\n\r\n const token = uuid.v4();\r\n\r\n this.webex.getWindow().sessionStorage.setItem('oauth2-csrf-token', token);\r\n\r\n return token;\r\n },\r\n\r\n /**\r\n * Checks if the CSRF token in sessionStorage is the same as the one returned\r\n * in the url.\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} query\r\n * @private\r\n * @returns {Promise}\r\n */\r\n _verifySecurityToken(query) {\r\n const sessionToken = this.webex.getWindow().sessionStorage.getItem(OAUTH2_CSRF_TOKEN);\r\n\r\n this.webex.getWindow().sessionStorage.removeItem(OAUTH2_CSRF_TOKEN);\r\n if (!sessionToken) {\r\n return;\r\n }\r\n\r\n if (!query.state) {\r\n throw new Error(`Expected CSRF token ${sessionToken}, but not found in redirect query`);\r\n }\r\n\r\n if (!query.state.csrf_token) {\r\n throw new Error(`Expected CSRF token ${sessionToken}, but not found in redirect query`);\r\n }\r\n\r\n const token = query.state.csrf_token;\r\n\r\n if (token !== sessionToken) {\r\n throw new Error(`CSRF token ${token} does not match stored token ${sessionToken}`);\r\n }\r\n },\r\n});\r\n\r\nexport default Authorization;\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_querystring","_interopRequireDefault","require","_url","_common","_webexCore","_lodash","_uuid","_encBase64url","_cryptoJs","_dec","_dec2","_obj","lodash","OAUTH2_CSRF_TOKEN","OAUTH2_CODE_VERIFIER","Authorization","WebexPlugin","extend","whileInFlight","derived","isAuthenticating","deps","fn","isAuthorizing","session","default","type","ready","namespace","initialize","_this","_len","arguments","length","attrs","Array","_key","ret","_apply","prototype","location","url","parse","webex","getWindow","href","_checkForErrors","code","query","state","JSON","base64","decode","codeVerifier","sessionStorage","getItem","removeItem","emailhash","_verifySecurityToken","_cleanUrl","process","nextTick","internal","services","collectPreauthCatalog","catch","_promise","resolve","then","requestAuthorizationCodeGrant","initiateLogin","options","undefined","cloneDeep","email","emailHash","CryptoJS","SHA256","toString","csrf_token","_generateSecurityToken","code_challenge","_generateCodeChallenge","code_challenge_method","initiateAuthorizationCodeGrant","logger","info","credentials","buildLoginUrl","_assign","response_type","logout","noRedirect","buildLogoutUrl","_this2","reject","Error","form","grant_type","redirect_uri","config","self_contained_token","code_verifier","request","method","uri","tokenUrl","auth","user","client_id","pass","client_secret","sendImmediately","shouldRefreshAccessToken","res","set","supertoken","body","statusCode","ErrorConstructor","grantErrors","select","error","_res","history","replaceState","_deleteProperty","isEmpty","omit","encode","_stringify","search","querystring","stringify","format","safeCharacterMap","base64url","_safe_map","times","random","join","codeChallenge","setItem","token","uuid","v4","sessionToken","concat","version","_applyDecoratedDescriptor2","_getOwnPropertyDescriptor","oneFlight","_default","exports"],"sources":["authorization.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint camelcase: [0] */\n\nimport querystring from 'querystring';\nimport url from 'url';\n\nimport {base64, oneFlight, whileInFlight} from '@webex/common';\nimport {grantErrors, WebexPlugin} from '@webex/webex-core';\nimport {cloneDeep, isEmpty, omit} from 'lodash';\nimport uuid from 'uuid';\nimport base64url from 'crypto-js/enc-base64url';\nimport CryptoJS from 'crypto-js';\n\n// Necessary to require lodash this way in order to stub\n// methods in the unit test\nconst lodash = require('lodash');\n\nconst OAUTH2_CSRF_TOKEN = 'oauth2-csrf-token';\nconst OAUTH2_CODE_VERIFIER = 'oauth2-code-verifier';\n\n/**\n * Browser support for OAuth2. Automatically parses the URL query for an\n * authorization code\n *\n * Use of this plugin for anything other than the Webex Web Client is strongly\n * discouraged and may be broken at any time\n * @class\n * @name AuthorizationBrowserFirstParty\n * @private\n */\nconst Authorization = WebexPlugin.extend({\n derived: {\n /**\n * Alias of {@link AuthorizationBrowserFirstParty#isAuthorizing}\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @type {boolean}\n */\n isAuthenticating: {\n deps: ['isAuthorizing'],\n fn() {\n return this.isAuthorizing;\n },\n },\n },\n\n session: {\n /**\n * Indicates if an Authorization Code exchange is inflight\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @type {boolean}\n */\n isAuthorizing: {\n default: false,\n type: 'boolean',\n },\n ready: {\n default: false,\n type: 'boolean',\n },\n },\n\n namespace: 'Credentials',\n\n /**\n * Initializer\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @private\n * @returns {Authorization}\n */\n // eslint-disable-next-line complexity\n initialize(...attrs) {\n const ret = Reflect.apply(WebexPlugin.prototype.initialize, this, attrs);\n const location = url.parse(this.webex.getWindow().location.href, true);\n\n this._checkForErrors(location);\n\n const {code} = location.query;\n\n if (!code) {\n this.ready = true;\n\n return ret;\n }\n\n if (location.query.state) {\n location.query.state = JSON.parse(base64.decode(location.query.state));\n } else {\n location.query.state = {};\n }\n\n const codeVerifier = this.webex.getWindow().sessionStorage.getItem(OAUTH2_CODE_VERIFIER);\n\n this.webex.getWindow().sessionStorage.removeItem(OAUTH2_CODE_VERIFIER);\n\n const {emailhash} = location.query.state;\n\n this._verifySecurityToken(location.query);\n this._cleanUrl(location);\n\n // Wait until nextTick in case `credentials` hasn't initialized yet\n process.nextTick(() => {\n this.webex.internal.services\n .collectPreauthCatalog({emailhash})\n .catch(() => Promise.resolve())\n .then(() => this.requestAuthorizationCodeGrant({code, codeVerifier}))\n .then(() => {\n this.ready = true;\n });\n });\n\n return ret;\n },\n\n /**\n * Kicks off an oauth flow\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} options\n * @returns {Promise}\n */\n initiateLogin(options = {}) {\n options = cloneDeep(options);\n if (options.email) {\n options.emailHash = CryptoJS.SHA256(options.email).toString();\n }\n delete options.email;\n options.state = options.state || {};\n options.state.csrf_token = this._generateSecurityToken();\n // catalog uses emailhash and redirectCI uses emailHash\n options.state.emailhash = options.emailHash;\n\n options.code_challenge = this._generateCodeChallenge();\n options.code_challenge_method = 'S256';\n\n return this.initiateAuthorizationCodeGrant(options);\n },\n\n @whileInFlight('isAuthorizing')\n /**\n * Kicks off the Implicit Code grant flow. Typically called via\n * {@link AuthorizationBrowserFirstParty#initiateLogin}\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} options\n * @returns {Promise}\n */\n initiateAuthorizationCodeGrant(options) {\n this.logger.info('authorization: initiating authorization code grant flow');\n this.webex.getWindow().location = this.webex.credentials.buildLoginUrl(\n Object.assign({response_type: 'code'}, options)\n );\n\n return Promise.resolve();\n },\n\n /**\n * Called by {@link WebexCore#logout()}. Redirects to the logout page\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} options\n * @param {boolean} options.noRedirect if true, does not redirect\n * @returns {Promise}\n */\n logout(options = {}) {\n if (!options.noRedirect) {\n this.webex.getWindow().location = this.webex.credentials.buildLogoutUrl(options);\n }\n },\n\n @whileInFlight('isAuthorizing')\n @oneFlight\n /**\n * Exchanges an authorization code for an access token\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} options\n * @param {Object} options.code\n * @returns {Promise}\n */\n requestAuthorizationCodeGrant(options = {}) {\n this.logger.info('credentials: requesting authorization code grant');\n\n if (!options.code) {\n return Promise.reject(new Error('`options.code` is required'));\n }\n\n const form = {\n grant_type: 'authorization_code',\n redirect_uri: this.config.redirect_uri,\n code: options.code,\n self_contained_token: true,\n };\n\n if (options.codeVerifier) {\n form.code_verifier = options.codeVerifier;\n }\n\n return this.webex\n .request({\n method: 'POST',\n uri: this.config.tokenUrl,\n form,\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n })\n .then((res) => {\n this.webex.credentials.set({supertoken: res.body});\n })\n .catch((res) => {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n });\n },\n\n /**\n * Checks if the result of the login redirect contains an error string\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} location\n * @private\n * @returns {Promise}\n */\n _checkForErrors(location) {\n const {query} = location;\n\n if (query && query.error) {\n const ErrorConstructor = grantErrors.select(query.error);\n\n throw new ErrorConstructor(query);\n }\n },\n\n /**\n * Removes no-longer needed values from the url (access token, csrf token, etc)\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} location\n * @private\n * @returns {Promise}\n */\n _cleanUrl(location) {\n location = cloneDeep(location);\n if (this.webex.getWindow().history && this.webex.getWindow().history.replaceState) {\n Reflect.deleteProperty(location.query, 'code');\n if (isEmpty(omit(location.query.state, 'csrf_token'))) {\n Reflect.deleteProperty(location.query, 'state');\n } else {\n location.query.state = base64.encode(\n JSON.stringify(omit(location.query.state, 'csrf_token'))\n );\n }\n location.search = querystring.stringify(location.query);\n Reflect.deleteProperty(location, 'query');\n this.webex.getWindow().history.replaceState({}, null, url.format(location));\n }\n },\n\n /**\n * Generates PKCE code verifier and code challenge and sets the the code verifier in sessionStorage\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @private\n * @returns {string}\n */\n _generateCodeChallenge() {\n this.logger.info('authorization: generating PKCE code challenge');\n\n // eslint-disable-next-line no-underscore-dangle\n const safeCharacterMap = base64url._safe_map;\n\n const codeVerifier = lodash\n .times(128, () => safeCharacterMap[lodash.random(0, safeCharacterMap.length - 1)])\n .join('');\n\n const codeChallenge = CryptoJS.SHA256(codeVerifier).toString(base64url);\n\n this.webex.getWindow().sessionStorage.setItem(OAUTH2_CODE_VERIFIER, codeVerifier);\n\n return codeChallenge;\n },\n\n /**\n * Generates a CSRF token and sticks in in sessionStorage\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @private\n * @returns {Promise}\n */\n _generateSecurityToken() {\n this.logger.info('authorization: generating csrf token');\n\n const token = uuid.v4();\n\n this.webex.getWindow().sessionStorage.setItem('oauth2-csrf-token', token);\n\n return token;\n },\n\n /**\n * Checks if the CSRF token in sessionStorage is the same as the one returned\n * in the url.\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} query\n * @private\n * @returns {Promise}\n */\n _verifySecurityToken(query) {\n const sessionToken = this.webex.getWindow().sessionStorage.getItem(OAUTH2_CSRF_TOKEN);\n\n this.webex.getWindow().sessionStorage.removeItem(OAUTH2_CSRF_TOKEN);\n if (!sessionToken) {\n return;\n }\n\n if (!query.state) {\n throw new Error(`Expected CSRF token ${sessionToken}, but not found in redirect query`);\n }\n\n if (!query.state.csrf_token) {\n throw new Error(`Expected CSRF token ${sessionToken}, but not found in redirect query`);\n }\n\n const token = query.state.csrf_token;\n\n if (token !== sessionToken) {\n throw new Error(`CSRF token ${token} does not match stored token ${sessionToken}`);\n }\n },\n});\n\nexport default Authorization;\n"],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -5,17 +5,17 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
|
-
/*!
|
|
9
|
-
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
8
|
+
/*!
|
|
9
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
10
10
|
*/
|
|
11
11
|
var _default = {
|
|
12
12
|
credentials: {
|
|
13
|
-
/**
|
|
14
|
-
* Controls whether {@link Authorization#initiateLogin()} requests a token
|
|
15
|
-
* or an auth code. Anything other than 'confidential' will be treated as
|
|
16
|
-
* 'public'
|
|
17
|
-
* @private
|
|
18
|
-
* @type {string}
|
|
13
|
+
/**
|
|
14
|
+
* Controls whether {@link Authorization#initiateLogin()} requests a token
|
|
15
|
+
* or an auth code. Anything other than 'confidential' will be treated as
|
|
16
|
+
* 'public'
|
|
17
|
+
* @private
|
|
18
|
+
* @type {string}
|
|
19
19
|
*/
|
|
20
20
|
clientType: 'public',
|
|
21
21
|
refreshCallback: function refreshCallback(webex, token) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_default","credentials","clientType","refreshCallback","webex","token","request","method","uri","config","tokenUrl","form","grant_type","redirect_uri","refresh_token","auth","user","client_id","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","exports","default"],"sources":["config.js"],"sourcesContent":["/*!\
|
|
1
|
+
{"version":3,"names":["_default","credentials","clientType","refreshCallback","webex","token","request","method","uri","config","tokenUrl","form","grant_type","redirect_uri","refresh_token","auth","user","client_id","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","exports","default"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nexport default {\n credentials: {\n /**\n * Controls whether {@link Authorization#initiateLogin()} requests a token\n * or an auth code. Anything other than 'confidential' will be treated as\n * 'public'\n * @private\n * @type {string}\n */\n clientType: 'public',\n\n refreshCallback(webex, token) {\n /* eslint-disable camelcase */\n return webex\n .request({\n method: 'POST',\n uri: token.config.tokenUrl,\n form: {\n grant_type: 'refresh_token',\n redirect_uri: token.config.redirect_uri,\n refresh_token: token.refresh_token,\n },\n auth: {\n user: token.config.client_id,\n pass: token.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n })\n .then((res) => res.body);\n /* eslint-enable camelcase */\n },\n },\n};\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AAFA,IAAAA,QAAA,GAIe;EACbC,WAAW,EAAE;IACX;AACJ;AACA;AACA;AACA;AACA;AACA;IACIC,UAAU,EAAE,QAAQ;IAEpBC,eAAe,WAAAA,gBAACC,KAAK,EAAEC,KAAK,EAAE;MAC5B;MACA,OAAOD,KAAK,CACTE,OAAO,CAAC;QACPC,MAAM,EAAE,MAAM;QACdC,GAAG,EAAEH,KAAK,CAACI,MAAM,CAACC,QAAQ;QAC1BC,IAAI,EAAE;UACJC,UAAU,EAAE,eAAe;UAC3BC,YAAY,EAAER,KAAK,CAACI,MAAM,CAACI,YAAY;UACvCC,aAAa,EAAET,KAAK,CAACS;QACvB,CAAC;QACDC,IAAI,EAAE;UACJC,IAAI,EAAEX,KAAK,CAACI,MAAM,CAACQ,SAAS;UAC5BC,IAAI,EAAEb,KAAK,CAACI,MAAM,CAACU,aAAa;UAChCC,eAAe,EAAE;QACnB,CAAC;QACDC,wBAAwB,EAAE;MAC5B,CAAC,CAAC,CACDC,IAAI,CAAC,UAACC,GAAG;QAAA,OAAKA,GAAG,CAACC,IAAI;MAAA,EAAC;MAC1B;IACF;EACF;AACF,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAA1B,QAAA"}
|
package/dist/index.js
CHANGED
|
@@ -20,8 +20,8 @@ _Object$defineProperty(exports, "default", {
|
|
|
20
20
|
var _webexCore = require("@webex/webex-core");
|
|
21
21
|
var _authorization = _interopRequireDefault(require("./authorization"));
|
|
22
22
|
var _config = _interopRequireDefault(require("./config"));
|
|
23
|
-
/*!
|
|
24
|
-
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
23
|
+
/*!
|
|
24
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
27
|
var proxies = ['isAuthorizing', 'isAuthenticating'];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_webexCore","require","_authorization","_interopRequireDefault","_config","proxies","registerPlugin","Authorization","config"],"sources":["index.js"],"sourcesContent":["/*!\
|
|
1
|
+
{"version":3,"names":["_webexCore","require","_authorization","_interopRequireDefault","_config","proxies","registerPlugin","Authorization","config"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {registerPlugin} from '@webex/webex-core';\n\nimport Authorization from './authorization';\nimport config from './config';\n\nconst proxies = ['isAuthorizing', 'isAuthenticating'];\n\nregisterPlugin('authorization', Authorization, {\n config,\n proxies,\n});\n\nexport {default} from './authorization';\nexport {default as config} from './config';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAIA,IAAAA,UAAA,GAAAC,OAAA;AAEA,IAAAC,cAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,OAAA,GAAAD,sBAAA,CAAAF,OAAA;AAPA;AACA;AACA;;AAOA,IAAMI,OAAO,GAAG,CAAC,eAAe,EAAE,kBAAkB,CAAC;AAErD,IAAAC,yBAAc,EAAC,eAAe,EAAEC,sBAAa,EAAE;EAC7CC,MAAM,EAANA,eAAM;EACNH,OAAO,EAAPA;AACF,CAAC,CAAC"}
|
package/jest.config.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const config = require('@webex/jest-config-legacy');
|
|
2
|
-
|
|
3
|
-
module.exports = config;
|
|
1
|
+
const config = require('@webex/jest-config-legacy');
|
|
2
|
+
|
|
3
|
+
module.exports = config;
|
package/package.json
CHANGED
|
@@ -26,23 +26,23 @@
|
|
|
26
26
|
"@webex/eslint-config-legacy": "^0.0.0",
|
|
27
27
|
"@webex/jest-config-legacy": "^0.0.0",
|
|
28
28
|
"@webex/legacy-tools": "^0.0.0",
|
|
29
|
-
"@webex/test-helper-chai": "^2.59.
|
|
30
|
-
"@webex/test-helper-mocha": "^2.59.
|
|
31
|
-
"@webex/test-helper-mock-webex": "^2.59.
|
|
32
|
-
"@webex/test-helper-test-users": "^2.59.
|
|
29
|
+
"@webex/test-helper-chai": "^2.59.4-next.1",
|
|
30
|
+
"@webex/test-helper-mocha": "^2.59.4-next.1",
|
|
31
|
+
"@webex/test-helper-mock-webex": "^2.59.4-next.1",
|
|
32
|
+
"@webex/test-helper-test-users": "^2.59.4-next.1",
|
|
33
33
|
"eslint": "^8.24.0",
|
|
34
34
|
"prettier": "^2.7.1",
|
|
35
35
|
"sinon": "^9.2.4"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@webex/common": "^2.59.
|
|
39
|
-
"@webex/storage-adapter-local-storage": "^2.59.
|
|
40
|
-
"@webex/test-helper-automation": "^2.59.
|
|
41
|
-
"@webex/test-helper-chai": "^2.59.
|
|
42
|
-
"@webex/test-helper-mocha": "^2.59.
|
|
43
|
-
"@webex/test-helper-mock-webex": "^2.59.
|
|
44
|
-
"@webex/test-helper-test-users": "^2.59.
|
|
45
|
-
"@webex/webex-core": "^2.59.
|
|
38
|
+
"@webex/common": "^2.59.4-next.1",
|
|
39
|
+
"@webex/storage-adapter-local-storage": "^2.59.4-next.1",
|
|
40
|
+
"@webex/test-helper-automation": "^2.59.4-next.1",
|
|
41
|
+
"@webex/test-helper-chai": "^2.59.4-next.1",
|
|
42
|
+
"@webex/test-helper-mocha": "^2.59.4-next.1",
|
|
43
|
+
"@webex/test-helper-mock-webex": "^2.59.4-next.1",
|
|
44
|
+
"@webex/test-helper-test-users": "^2.59.4-next.1",
|
|
45
|
+
"@webex/webex-core": "^2.59.4-next.1",
|
|
46
46
|
"crypto-js": "^4.1.1",
|
|
47
47
|
"lodash": "^4.17.21",
|
|
48
48
|
"uuid": "^3.3.2"
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"test:style": "eslint ./src/**/*.*",
|
|
58
58
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
59
59
|
},
|
|
60
|
-
"version": "2.59.
|
|
60
|
+
"version": "2.59.4-next.1"
|
|
61
61
|
}
|