@itwin/map-layers-auth 3.2.0-dev.71

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.
Files changed (58) hide show
  1. package/README.md +32 -0
  2. package/lib/cjs/ArcGis/ArcGisAccessClient.d.ts +67 -0
  3. package/lib/cjs/ArcGis/ArcGisAccessClient.d.ts.map +1 -0
  4. package/lib/cjs/ArcGis/ArcGisAccessClient.js +295 -0
  5. package/lib/cjs/ArcGis/ArcGisAccessClient.js.map +1 -0
  6. package/lib/cjs/ArcGis/ArcGisOAuth2Endpoint.d.ts +23 -0
  7. package/lib/cjs/ArcGis/ArcGisOAuth2Endpoint.d.ts.map +1 -0
  8. package/lib/cjs/ArcGis/ArcGisOAuth2Endpoint.js +47 -0
  9. package/lib/cjs/ArcGis/ArcGisOAuth2Endpoint.js.map +1 -0
  10. package/lib/cjs/ArcGis/ArcGisOauthRedirect.d.ts +4 -0
  11. package/lib/cjs/ArcGis/ArcGisOauthRedirect.d.ts.map +1 -0
  12. package/lib/cjs/ArcGis/ArcGisOauthRedirect.js +31 -0
  13. package/lib/cjs/ArcGis/ArcGisOauthRedirect.js.map +1 -0
  14. package/lib/cjs/ArcGis/ArcGisTokenGenerator.d.ts +42 -0
  15. package/lib/cjs/ArcGis/ArcGisTokenGenerator.d.ts.map +1 -0
  16. package/lib/cjs/ArcGis/ArcGisTokenGenerator.js +111 -0
  17. package/lib/cjs/ArcGis/ArcGisTokenGenerator.js.map +1 -0
  18. package/lib/cjs/ArcGis/ArcGisTokenManager.d.ts +21 -0
  19. package/lib/cjs/ArcGis/ArcGisTokenManager.d.ts.map +1 -0
  20. package/lib/cjs/ArcGis/ArcGisTokenManager.js +110 -0
  21. package/lib/cjs/ArcGis/ArcGisTokenManager.js.map +1 -0
  22. package/lib/cjs/ArcGis/ArcGisUrl.d.ts +7 -0
  23. package/lib/cjs/ArcGis/ArcGisUrl.d.ts.map +1 -0
  24. package/lib/cjs/ArcGis/ArcGisUrl.js +50 -0
  25. package/lib/cjs/ArcGis/ArcGisUrl.js.map +1 -0
  26. package/lib/cjs/map-layers-auth.d.ts +7 -0
  27. package/lib/cjs/map-layers-auth.d.ts.map +1 -0
  28. package/lib/cjs/map-layers-auth.js +23 -0
  29. package/lib/cjs/map-layers-auth.js.map +1 -0
  30. package/lib/esm/ArcGis/ArcGisAccessClient.d.ts +67 -0
  31. package/lib/esm/ArcGis/ArcGisAccessClient.d.ts.map +1 -0
  32. package/lib/esm/ArcGis/ArcGisAccessClient.js +291 -0
  33. package/lib/esm/ArcGis/ArcGisAccessClient.js.map +1 -0
  34. package/lib/esm/ArcGis/ArcGisOAuth2Endpoint.d.ts +23 -0
  35. package/lib/esm/ArcGis/ArcGisOAuth2Endpoint.d.ts.map +1 -0
  36. package/lib/esm/ArcGis/ArcGisOAuth2Endpoint.js +43 -0
  37. package/lib/esm/ArcGis/ArcGisOAuth2Endpoint.js.map +1 -0
  38. package/lib/esm/ArcGis/ArcGisOauthRedirect.d.ts +4 -0
  39. package/lib/esm/ArcGis/ArcGisOauthRedirect.d.ts.map +1 -0
  40. package/lib/esm/ArcGis/ArcGisOauthRedirect.js +27 -0
  41. package/lib/esm/ArcGis/ArcGisOauthRedirect.js.map +1 -0
  42. package/lib/esm/ArcGis/ArcGisTokenGenerator.d.ts +42 -0
  43. package/lib/esm/ArcGis/ArcGisTokenGenerator.d.ts.map +1 -0
  44. package/lib/esm/ArcGis/ArcGisTokenGenerator.js +107 -0
  45. package/lib/esm/ArcGis/ArcGisTokenGenerator.js.map +1 -0
  46. package/lib/esm/ArcGis/ArcGisTokenManager.d.ts +21 -0
  47. package/lib/esm/ArcGis/ArcGisTokenManager.d.ts.map +1 -0
  48. package/lib/esm/ArcGis/ArcGisTokenManager.js +106 -0
  49. package/lib/esm/ArcGis/ArcGisTokenManager.js.map +1 -0
  50. package/lib/esm/ArcGis/ArcGisUrl.d.ts +7 -0
  51. package/lib/esm/ArcGis/ArcGisUrl.d.ts.map +1 -0
  52. package/lib/esm/ArcGis/ArcGisUrl.js +46 -0
  53. package/lib/esm/ArcGis/ArcGisUrl.js.map +1 -0
  54. package/lib/esm/map-layers-auth.d.ts +7 -0
  55. package/lib/esm/map-layers-auth.d.ts.map +1 -0
  56. package/lib/esm/map-layers-auth.js +11 -0
  57. package/lib/esm/map-layers-auth.js.map +1 -0
  58. package/package.json +118 -0
package/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # MapLayers-auth Extension/Package
2
+
3
+ Copyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md for license terms and full copyright notice.
4
+
5
+ An iTwin.js Extension that adds a widget for attaching and updating map attachments in a view:
6
+
7
+ This extension serves as an example of a extension that can be added to iTwin.js host applications.
8
+ See <http://itwinjs.org> for comprehensive documentation on the iTwin.js API and the various constructs used in this sample.
9
+
10
+ This package can also be installed into an application and the method MapLayersUI.initialized() called during the host IModelApps initialize processing.
11
+
12
+ ## Development Setup
13
+
14
+ 1. Select and prepare an iTwin.js host application. You can use the [ui-test-app] to host the extension, for example.
15
+ 2. The dependencies are installed as part of "rush install" in the iTwin.js repository.
16
+ 3. Build the extension as part of the "rush build" in the iTwin.js repository, or separately build using the npm build command.
17
+
18
+ ```sh
19
+ npm run build
20
+ ```
21
+
22
+ 4. Start the host application - go to its directory and run:
23
+
24
+ ```sh
25
+ npm run start:servers
26
+ ```
27
+
28
+ 5. Open a web browser (e.g., Chrome), and browse to <http://localhost:3000>.
29
+
30
+ ## Contributing
31
+
32
+ [Contributing to iTwin.js](https://github.com/iTwin/itwinjs-core/blob/master/CONTRIBUTING.md)
@@ -0,0 +1,67 @@
1
+ /** @packageDocumentation
2
+ * @module Tiles
3
+ */
4
+ import { BeEvent } from "@itwin/core-bentley";
5
+ import { MapLayerAccessClient, MapLayerAccessToken, MapLayerAccessTokenParams, MapLayerTokenEndpoint } from "@itwin/core-frontend";
6
+ /** @beta */
7
+ export interface ArcGisEnterpriseClientId {
8
+ serviceBaseUrl: string;
9
+ clientId: string;
10
+ }
11
+ /** @beta */
12
+ export interface ArcGisOAuthClientIds {
13
+ arcgisOnlineClientId?: string;
14
+ enterpriseClientIds?: ArcGisEnterpriseClientId[];
15
+ }
16
+ /** @beta
17
+ * ArcGIS OAuth configurations parameters.
18
+ * See https://developers.arcgis.com/documentation/mapping-apis-and-services/security/arcgis-identity/serverless-web-apps/
19
+ * more details.
20
+ */
21
+ export interface ArcGisOAuthConfig {
22
+ redirectUri: string;
23
+ tokenExpiration?: number;
24
+ clientIds: ArcGisOAuthClientIds;
25
+ }
26
+ /** @beta */
27
+ export declare class ArcGisAccessClient implements MapLayerAccessClient {
28
+ readonly onOAuthProcessEnd: BeEvent<import("@itwin/core-bentley").Listener>;
29
+ private _redirectUri;
30
+ private _expiration;
31
+ private _clientIds;
32
+ constructor();
33
+ initialize(oAuthConfig?: ArcGisOAuthConfig): boolean;
34
+ private initOauthCallbackFunction;
35
+ unInitialize(): void;
36
+ getAccessToken(params: MapLayerAccessTokenParams): Promise<MapLayerAccessToken | undefined>;
37
+ getTokenServiceEndPoint(mapLayerUrl: string): Promise<MapLayerTokenEndpoint | undefined>;
38
+ invalidateToken(token: MapLayerAccessToken): boolean;
39
+ get redirectUri(): string | undefined;
40
+ getMatchingEnterpriseClientId(url: string): string | undefined;
41
+ get expiration(): number | undefined;
42
+ get arcGisOnlineClientId(): string | undefined;
43
+ set arcGisOnlineClientId(clientId: string | undefined);
44
+ get arcGisEnterpriseClientIds(): ArcGisEnterpriseClientId[] | undefined;
45
+ setEnterpriseClientId(serviceBaseUrl: string, clientId: string): void;
46
+ removeEnterpriseClientId(clientId: ArcGisEnterpriseClientId): void;
47
+ /** @internal */
48
+ private getOAuthTokenForMapLayerUrl;
49
+ /**
50
+ * Test if Oauth2 endpoint is accessible and has an associated appId
51
+ * @internal
52
+ */
53
+ private validateOAuth2Endpoint;
54
+ private _oauthAuthorizeEndPointsCache;
55
+ private _oauthTokenEndPointsCache;
56
+ /**
57
+ * Get OAuth2 endpoint that must be cause to get the Oauth2 token
58
+ * @internal
59
+ */
60
+ private getOAuth2Endpoint;
61
+ /**
62
+ * Construct the complete Authorize url to starts the Oauth process
63
+ * @internal
64
+ */
65
+ private constructLoginUrl;
66
+ }
67
+ //# sourceMappingURL=ArcGisAccessClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisAccessClient.d.ts","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisAccessClient.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAU,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAMnI,YAAY;AACZ,MAAM,WAAW,wBAAwB;IAGvC,cAAc,EAAE,MAAM,CAAC;IAGvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,YAAY;AACZ,MAAM,WAAW,oBAAoB;IAEnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAG9B,mBAAmB,CAAC,EAAE,wBAAwB,EAAE,CAAC;CAClD;AAED;;;;EAIE;AACF,MAAM,WAAW,iBAAiB;IAIhC,WAAW,EAAE,MAAM,CAAC;IAGpB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED,YAAY;AACZ,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,SAAgB,iBAAiB,kDAAiB;IAClD,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,UAAU,CAAmC;;IAK9C,UAAU,CAAC,WAAW,CAAC,EAAE,iBAAiB,GAAG,OAAO;IAW3D,OAAO,CAAC,yBAAyB;IAoC1B,YAAY;IAMN,cAAc,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAgB3F,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAa9F,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO;IAQ3D,IAAW,WAAW,uBAErB;IAEM,6BAA6B,CAAC,GAAG,EAAE,MAAM;IAchD,IAAW,UAAU,uBAEpB;IAED,IAAW,oBAAoB,IAIW,MAAM,GAAG,SAAS,CAF3D;IAED,IAAW,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAK3D;IAED,IAAW,yBAAyB,2CAEnC;IAEM,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAiB9D,wBAAwB,CAAC,QAAQ,EAAE,wBAAwB;IASlE,gBAAgB;YACF,2BAA2B;IAWzC;;;MAGE;YACY,sBAAsB;IAoBpC,OAAO,CAAC,6BAA6B,CAA0B;IAC/D,OAAO,CAAC,yBAAyB,CAA0B;IAE3D;;;KAGC;YACa,iBAAiB;IAwE/B;;;KAGC;IACD,OAAO,CAAC,iBAAiB;CA8B1B"}
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module Tiles
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ArcGisAccessClient = void 0;
11
+ const core_bentley_1 = require("@itwin/core-bentley");
12
+ const ArcGisTokenGenerator_1 = require("./ArcGisTokenGenerator");
13
+ const ArcGisOAuth2Endpoint_1 = require("./ArcGisOAuth2Endpoint");
14
+ const ArcGisTokenManager_1 = require("./ArcGisTokenManager");
15
+ const ArcGisUrl_1 = require("./ArcGisUrl");
16
+ /** @beta */
17
+ class ArcGisAccessClient {
18
+ constructor() {
19
+ this.onOAuthProcessEnd = new core_bentley_1.BeEvent();
20
+ // Derive the Oauth URL from a typical MapLayerURL
21
+ // i.e. https://hostname/server/rest/services/NewYork/NewYork3857/MapServer
22
+ // => https://hostname/portal/sharing/oauth2/authorize
23
+ this._oauthAuthorizeEndPointsCache = new Map();
24
+ this._oauthTokenEndPointsCache = new Map();
25
+ }
26
+ initialize(oAuthConfig) {
27
+ if (oAuthConfig) {
28
+ this._redirectUri = oAuthConfig.redirectUri;
29
+ this._expiration = oAuthConfig.tokenExpiration;
30
+ this._clientIds = oAuthConfig.clientIds;
31
+ this.initOauthCallbackFunction();
32
+ }
33
+ return true;
34
+ }
35
+ initOauthCallbackFunction() {
36
+ window.arcGisOAuth2Callback = (redirectLocation) => {
37
+ var _a, _b, _c, _d;
38
+ let eventSuccess = false;
39
+ let stateData;
40
+ if (redirectLocation && redirectLocation.hash.length > 0) {
41
+ const locationHash = redirectLocation.hash;
42
+ const hashParams = new URLSearchParams(locationHash.substring(1));
43
+ const token = (_a = hashParams.get("access_token")) !== null && _a !== void 0 ? _a : undefined;
44
+ const expiresInStr = (_b = hashParams.get("expires_in")) !== null && _b !== void 0 ? _b : undefined;
45
+ const userName = (_c = hashParams.get("username")) !== null && _c !== void 0 ? _c : undefined;
46
+ const ssl = hashParams.get("ssl") === "true";
47
+ const stateStr = (_d = hashParams.get("state")) !== null && _d !== void 0 ? _d : undefined;
48
+ const persist = hashParams.get("persist") === "true";
49
+ if (token !== undefined && expiresInStr !== undefined && userName !== undefined && ssl !== undefined && stateStr !== undefined) {
50
+ let endpointOrigin;
51
+ try {
52
+ const state = JSON.parse(stateStr);
53
+ stateData = state === null || state === void 0 ? void 0 : state.customData;
54
+ endpointOrigin = state === null || state === void 0 ? void 0 : state.endpointOrigin;
55
+ }
56
+ catch {
57
+ }
58
+ const expiresIn = Number(expiresInStr);
59
+ const expiresAt = (expiresIn * 1000) + (+new Date()); // Converts the token expiration delay (seconds) into a timestamp (UNIX time)
60
+ if (endpointOrigin !== undefined) {
61
+ ArcGisTokenManager_1.ArcGisTokenManager.setOAuth2Token(endpointOrigin, { token, expiresAt, ssl, userName, persist });
62
+ eventSuccess = true;
63
+ }
64
+ }
65
+ }
66
+ this.onOAuthProcessEnd.raiseEvent(eventSuccess, stateData);
67
+ };
68
+ }
69
+ unInitialize() {
70
+ this._redirectUri = undefined;
71
+ this._expiration = undefined;
72
+ window.arcGisOAuth2Callback = undefined;
73
+ }
74
+ async getAccessToken(params) {
75
+ // First lookup Oauth2 tokens, otherwise check try "legacy tokens" if credentials were provided
76
+ try {
77
+ const oauth2Token = await this.getOAuthTokenForMapLayerUrl(params.mapLayerUrl.toString());
78
+ if (oauth2Token)
79
+ return oauth2Token;
80
+ if (params.userName && params.password) {
81
+ return await ArcGisTokenManager_1.ArcGisTokenManager.getToken(params.mapLayerUrl.toString(), params.userName, params.password, { client: ArcGisTokenGenerator_1.ArcGisTokenClientType.referer });
82
+ }
83
+ }
84
+ catch {
85
+ }
86
+ return undefined;
87
+ }
88
+ async getTokenServiceEndPoint(mapLayerUrl) {
89
+ let tokenEndpoint;
90
+ try {
91
+ tokenEndpoint = await this.getOAuth2Endpoint(mapLayerUrl, ArcGisOAuth2Endpoint_1.ArcGisOAuth2EndpointType.Authorize);
92
+ if (tokenEndpoint) {
93
+ }
94
+ }
95
+ catch { }
96
+ return tokenEndpoint;
97
+ }
98
+ invalidateToken(token) {
99
+ let found = ArcGisTokenManager_1.ArcGisTokenManager.invalidateToken(token);
100
+ if (!found) {
101
+ found = ArcGisTokenManager_1.ArcGisTokenManager.invalidateOAuth2Token(token);
102
+ }
103
+ return found;
104
+ }
105
+ get redirectUri() {
106
+ return this._redirectUri;
107
+ }
108
+ getMatchingEnterpriseClientId(url) {
109
+ let clientId;
110
+ const clientIds = this.arcGisEnterpriseClientIds;
111
+ if (!clientIds) {
112
+ return undefined;
113
+ }
114
+ for (const entry of clientIds) {
115
+ if (url.toLowerCase().startsWith(entry.serviceBaseUrl)) {
116
+ clientId = entry.clientId;
117
+ }
118
+ }
119
+ return clientId;
120
+ }
121
+ get expiration() {
122
+ return this._expiration;
123
+ }
124
+ get arcGisOnlineClientId() {
125
+ var _a;
126
+ return (_a = this._clientIds) === null || _a === void 0 ? void 0 : _a.arcgisOnlineClientId;
127
+ }
128
+ set arcGisOnlineClientId(clientId) {
129
+ if (this._clientIds === undefined) {
130
+ this._clientIds = { arcgisOnlineClientId: clientId };
131
+ }
132
+ this._clientIds.arcgisOnlineClientId = clientId;
133
+ }
134
+ get arcGisEnterpriseClientIds() {
135
+ var _a;
136
+ return (_a = this._clientIds) === null || _a === void 0 ? void 0 : _a.enterpriseClientIds;
137
+ }
138
+ setEnterpriseClientId(serviceBaseUrl, clientId) {
139
+ var _a;
140
+ if ((_a = this._clientIds) === null || _a === void 0 ? void 0 : _a.enterpriseClientIds) {
141
+ const foundIdx = this._clientIds.enterpriseClientIds.findIndex((entry) => entry.serviceBaseUrl === serviceBaseUrl);
142
+ if (foundIdx !== -1) {
143
+ this._clientIds.enterpriseClientIds[foundIdx].clientId = clientId;
144
+ }
145
+ else {
146
+ this._clientIds.enterpriseClientIds.push({ serviceBaseUrl, clientId });
147
+ }
148
+ }
149
+ else {
150
+ if (this._clientIds === undefined) {
151
+ this._clientIds = {};
152
+ }
153
+ this._clientIds.enterpriseClientIds = [{ serviceBaseUrl, clientId }];
154
+ }
155
+ }
156
+ removeEnterpriseClientId(clientId) {
157
+ var _a, _b, _c;
158
+ if ((_a = this._clientIds) === null || _a === void 0 ? void 0 : _a.enterpriseClientIds) {
159
+ this._clientIds.enterpriseClientIds = (_c = (_b = this._clientIds) === null || _b === void 0 ? void 0 : _b.enterpriseClientIds) === null || _c === void 0 ? void 0 : _c.filter((item) => item.serviceBaseUrl !== clientId.serviceBaseUrl);
160
+ }
161
+ }
162
+ /// //////////
163
+ /** @internal */
164
+ async getOAuthTokenForMapLayerUrl(mapLayerUrl) {
165
+ try {
166
+ const oauthEndpoint = await this.getOAuth2Endpoint(mapLayerUrl, ArcGisOAuth2Endpoint_1.ArcGisOAuth2EndpointType.Authorize);
167
+ if (oauthEndpoint !== undefined) {
168
+ const oauthEndpointUrl = new URL(oauthEndpoint.getUrl());
169
+ return ArcGisTokenManager_1.ArcGisTokenManager.getOAuth2Token(oauthEndpointUrl.origin);
170
+ }
171
+ }
172
+ catch { }
173
+ return undefined;
174
+ }
175
+ /**
176
+ * Test if Oauth2 endpoint is accessible and has an associated appId
177
+ * @internal
178
+ */
179
+ async validateOAuth2Endpoint(endpointUrl) {
180
+ // Check if we got a matching appId for that endpoint, otherwise its not worth going further
181
+ if (undefined === this.getMatchingEnterpriseClientId(endpointUrl)) {
182
+ return false;
183
+ }
184
+ let status;
185
+ try {
186
+ const data = await fetch(endpointUrl, { method: "GET" });
187
+ status = data.status;
188
+ }
189
+ catch (error) {
190
+ status = error.status;
191
+ }
192
+ return status === 400; // Oauth2 API returns 400 (Bad Request) when there are missing parameters
193
+ }
194
+ /**
195
+ * Get OAuth2 endpoint that must be cause to get the Oauth2 token
196
+ * @internal
197
+ */
198
+ async getOAuth2Endpoint(url, endpoint) {
199
+ // Return from cache if available
200
+ const cachedEndpoint = (endpoint === ArcGisOAuth2Endpoint_1.ArcGisOAuth2EndpointType.Authorize ? this._oauthAuthorizeEndPointsCache.get(url) : this._oauthTokenEndPointsCache.get(url));
201
+ if (cachedEndpoint !== undefined) {
202
+ return cachedEndpoint;
203
+ }
204
+ const cacheResult = (obj) => {
205
+ if (endpoint === ArcGisOAuth2Endpoint_1.ArcGisOAuth2EndpointType.Authorize) {
206
+ this._oauthAuthorizeEndPointsCache.set(url, obj);
207
+ }
208
+ else {
209
+ this._oauthTokenEndPointsCache.set(url, obj);
210
+ }
211
+ };
212
+ const endpointStr = (endpoint === ArcGisOAuth2Endpoint_1.ArcGisOAuth2EndpointType.Authorize ? "authorize" : "token");
213
+ const urlObj = new URL(url);
214
+ if (urlObj.hostname.toLowerCase().endsWith("arcgis.com")) {
215
+ // ArcGIS Online (fixed)
216
+ // Doc: https://developers.arcgis.com/documentation/mapping-apis-and-services/security/oauth-2.0/
217
+ if (this.arcGisOnlineClientId === undefined) {
218
+ return undefined;
219
+ }
220
+ const oauth2Url = `https://www.arcgis.com/sharing/rest/oauth2/${endpointStr}`;
221
+ return new ArcGisOAuth2Endpoint_1.ArcGisOAuth2Endpoint(url, this.constructLoginUrl(oauth2Url, true), true);
222
+ }
223
+ else {
224
+ // First attempt: derive the Oauth2 token URL from the 'tokenServicesUrl', exposed by the 'info request'
225
+ let restUrlFromTokenService;
226
+ try {
227
+ restUrlFromTokenService = await ArcGisUrl_1.ArcGisUrl.getRestUrlFromGenerateTokenUrl(urlObj);
228
+ }
229
+ catch { }
230
+ if (restUrlFromTokenService !== undefined) {
231
+ // Validate the URL we just composed
232
+ try {
233
+ const oauth2Url = `${restUrlFromTokenService.toString()}oauth2/${endpointStr}`;
234
+ if (await this.validateOAuth2Endpoint(oauth2Url)) {
235
+ const oauthEndpoint = new ArcGisOAuth2Endpoint_1.ArcGisOAuth2Endpoint(oauth2Url, this.constructLoginUrl(oauth2Url, false), false);
236
+ cacheResult(oauthEndpoint);
237
+ return oauthEndpoint;
238
+ }
239
+ }
240
+ catch { }
241
+ }
242
+ // If reach this point, that means we could not derive the token endpoint from 'tokenServicesUrl'
243
+ // lets use another approach.
244
+ // ArcGIS Enterprise Format https://<host>:<port>/<subdirectory>/sharing/rest/oauth2/authorize
245
+ const regExMatch = url.match(new RegExp(/([^&\/]+)\/rest\/services\/.*/, "i"));
246
+ if (regExMatch !== null && regExMatch.length >= 2) {
247
+ const subdirectory = regExMatch[1];
248
+ const port = (urlObj.port !== "80" && urlObj.port !== "443") ? `:${urlObj.port}` : "";
249
+ const newUrlObj = new URL(`${urlObj.protocol}//${urlObj.hostname}${port}/${subdirectory}/sharing/rest/oauth2/${endpointStr}`);
250
+ // Check again the URL we just composed
251
+ try {
252
+ const newUrl = newUrlObj.toString();
253
+ if (await this.validateOAuth2Endpoint(newUrl)) {
254
+ const oauthEndpoint = new ArcGisOAuth2Endpoint_1.ArcGisOAuth2Endpoint(newUrl, this.constructLoginUrl(newUrl, false), false);
255
+ cacheResult(oauthEndpoint);
256
+ return oauthEndpoint;
257
+ }
258
+ }
259
+ catch { }
260
+ }
261
+ }
262
+ return undefined; // we could not find any valid oauth2 endpoint
263
+ }
264
+ /**
265
+ * Construct the complete Authorize url to starts the Oauth process
266
+ * @internal
267
+ */
268
+ constructLoginUrl(url, isArcgisOnline) {
269
+ const urlObj = new URL(url);
270
+ // Set the client id
271
+ if (isArcgisOnline) {
272
+ const clientId = this.arcGisOnlineClientId;
273
+ (0, core_bentley_1.assert)(clientId !== undefined);
274
+ if (clientId !== undefined) {
275
+ urlObj.searchParams.set("client_id", clientId);
276
+ }
277
+ }
278
+ else {
279
+ const clientId = this.getMatchingEnterpriseClientId(url);
280
+ (0, core_bentley_1.assert)(clientId !== undefined);
281
+ if (undefined !== clientId) {
282
+ urlObj.searchParams.set("client_id", clientId);
283
+ }
284
+ }
285
+ urlObj.searchParams.set("response_type", "token");
286
+ if (this.expiration !== undefined) {
287
+ urlObj.searchParams.set("expiration", `${this.expiration}`);
288
+ }
289
+ if (this.redirectUri)
290
+ urlObj.searchParams.set("redirect_uri", this.redirectUri);
291
+ return urlObj.toString();
292
+ }
293
+ }
294
+ exports.ArcGisAccessClient = ArcGisAccessClient;
295
+ //# sourceMappingURL=ArcGisAccessClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisAccessClient.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisAccessClient.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { assert, BeEvent } from \"@itwin/core-bentley\";\r\nimport { MapLayerAccessClient, MapLayerAccessToken, MapLayerAccessTokenParams, MapLayerTokenEndpoint } from \"@itwin/core-frontend\";\r\nimport { ArcGisOAuth2Token, ArcGisTokenClientType } from \"./ArcGisTokenGenerator\";\r\nimport { ArcGisOAuth2Endpoint, ArcGisOAuth2EndpointType } from \"./ArcGisOAuth2Endpoint\";\r\nimport { ArcGisTokenManager } from \"./ArcGisTokenManager\";\r\nimport { ArcGisUrl } from \"./ArcGisUrl\";\r\n\r\n/** @beta */\r\nexport interface ArcGisEnterpriseClientId {\r\n /* Oauth API endpoint base URL (i.e. https://hostname/portal/sharing/oauth2/authorize)\r\n used to identify uniquely each enterprise server. */\r\n serviceBaseUrl: string;\r\n\r\n /* Application's clientId for this enterprise server.*/\r\n clientId: string;\r\n}\r\n\r\n/** @beta */\r\nexport interface ArcGisOAuthClientIds {\r\n /* Application's OAuth clientId in ArcGIS online */\r\n arcgisOnlineClientId?: string;\r\n\r\n /* Application's OAuth clientId for each enterprise server used. */\r\n enterpriseClientIds?: ArcGisEnterpriseClientId[];\r\n}\r\n\r\n/** @beta\r\n * ArcGIS OAuth configurations parameters.\r\n * See https://developers.arcgis.com/documentation/mapping-apis-and-services/security/arcgis-identity/serverless-web-apps/\r\n * more details.\r\n*/\r\nexport interface ArcGisOAuthConfig {\r\n /* URL to which a user is sent once they complete sign in authorization.\r\n Must match a URI you define in the developer dashboard, otherwise, the authorization will be rejected.\r\n */\r\n redirectUri: string;\r\n\r\n /* Optional expiration after which the token will expire. Defined in minutes with a maximum of two weeks (20160 minutes)*/\r\n tokenExpiration?: number;\r\n\r\n /* Application client Ids */\r\n clientIds: ArcGisOAuthClientIds;\r\n}\r\n\r\n/** @beta */\r\nexport class ArcGisAccessClient implements MapLayerAccessClient {\r\n public readonly onOAuthProcessEnd = new BeEvent();\r\n private _redirectUri: string | undefined;\r\n private _expiration: number | undefined;\r\n private _clientIds: ArcGisOAuthClientIds | undefined;\r\n\r\n public constructor() {\r\n }\r\n\r\n public initialize(oAuthConfig?: ArcGisOAuthConfig): boolean {\r\n if (oAuthConfig) {\r\n this._redirectUri = oAuthConfig.redirectUri;\r\n this._expiration = oAuthConfig.tokenExpiration;\r\n this._clientIds = oAuthConfig.clientIds;\r\n\r\n this.initOauthCallbackFunction();\r\n }\r\n return true;\r\n }\r\n\r\n private initOauthCallbackFunction() {\r\n (window as any).arcGisOAuth2Callback = (redirectLocation?: Location) => {\r\n let eventSuccess = false;\r\n let stateData;\r\n\r\n if (redirectLocation && redirectLocation.hash.length > 0) {\r\n const locationHash = redirectLocation.hash;\r\n const hashParams = new URLSearchParams(locationHash.substring(1));\r\n const token = hashParams.get(\"access_token\") ?? undefined;\r\n const expiresInStr = hashParams.get(\"expires_in\") ?? undefined;\r\n const userName = hashParams.get(\"username\") ?? undefined;\r\n const ssl = hashParams.get(\"ssl\") === \"true\";\r\n const stateStr = hashParams.get(\"state\") ?? undefined;\r\n const persist = hashParams.get(\"persist\") === \"true\";\r\n if (token !== undefined && expiresInStr !== undefined && userName !== undefined && ssl !== undefined && stateStr !== undefined) {\r\n let endpointOrigin;\r\n try {\r\n const state = JSON.parse(stateStr);\r\n stateData = state?.customData;\r\n endpointOrigin = state?.endpointOrigin;\r\n\r\n } catch {\r\n }\r\n const expiresIn = Number(expiresInStr);\r\n const expiresAt = (expiresIn * 1000) + (+new Date()); // Converts the token expiration delay (seconds) into a timestamp (UNIX time)\r\n if (endpointOrigin !== undefined) {\r\n ArcGisTokenManager.setOAuth2Token(endpointOrigin, { token, expiresAt, ssl, userName, persist });\r\n eventSuccess = true;\r\n }\r\n\r\n }\r\n }\r\n this.onOAuthProcessEnd.raiseEvent(eventSuccess, stateData);\r\n };\r\n }\r\n\r\n public unInitialize() {\r\n this._redirectUri = undefined;\r\n this._expiration = undefined;\r\n (window as any).arcGisOAuth2Callback = undefined;\r\n }\r\n\r\n public async getAccessToken(params: MapLayerAccessTokenParams): Promise<MapLayerAccessToken | undefined> {\r\n // First lookup Oauth2 tokens, otherwise check try \"legacy tokens\" if credentials were provided\r\n try {\r\n const oauth2Token = await this.getOAuthTokenForMapLayerUrl(params.mapLayerUrl.toString());\r\n if (oauth2Token)\r\n return oauth2Token;\r\n\r\n if (params.userName && params.password) {\r\n return await ArcGisTokenManager.getToken(params.mapLayerUrl.toString(), params.userName, params.password, { client: ArcGisTokenClientType.referer });\r\n }\r\n } catch {\r\n\r\n }\r\n return undefined;\r\n }\r\n\r\n public async getTokenServiceEndPoint(mapLayerUrl: string): Promise<MapLayerTokenEndpoint | undefined> {\r\n let tokenEndpoint: ArcGisOAuth2Endpoint | undefined;\r\n\r\n try {\r\n tokenEndpoint = await this.getOAuth2Endpoint(mapLayerUrl, ArcGisOAuth2EndpointType.Authorize);\r\n if (tokenEndpoint) {\r\n\r\n }\r\n } catch { }\r\n\r\n return tokenEndpoint;\r\n }\r\n\r\n public invalidateToken(token: MapLayerAccessToken): boolean {\r\n let found = ArcGisTokenManager.invalidateToken(token);\r\n if (!found) {\r\n found = ArcGisTokenManager.invalidateOAuth2Token(token);\r\n }\r\n return found;\r\n }\r\n\r\n public get redirectUri() {\r\n return this._redirectUri;\r\n }\r\n\r\n public getMatchingEnterpriseClientId(url: string) {\r\n let clientId: string | undefined;\r\n const clientIds = this.arcGisEnterpriseClientIds;\r\n if (!clientIds) {\r\n return undefined;\r\n }\r\n for (const entry of clientIds) {\r\n if (url.toLowerCase().startsWith(entry.serviceBaseUrl)) {\r\n clientId = entry.clientId;\r\n }\r\n }\r\n return clientId;\r\n }\r\n\r\n public get expiration() {\r\n return this._expiration;\r\n }\r\n\r\n public get arcGisOnlineClientId() {\r\n return this._clientIds?.arcgisOnlineClientId;\r\n }\r\n\r\n public set arcGisOnlineClientId(clientId: string | undefined) {\r\n if (this._clientIds === undefined) {\r\n this._clientIds = { arcgisOnlineClientId: clientId };\r\n }\r\n this._clientIds.arcgisOnlineClientId = clientId;\r\n }\r\n\r\n public get arcGisEnterpriseClientIds() {\r\n return this._clientIds?.enterpriseClientIds;\r\n }\r\n\r\n public setEnterpriseClientId(serviceBaseUrl: string, clientId: string) {\r\n\r\n if (this._clientIds?.enterpriseClientIds) {\r\n const foundIdx = this._clientIds.enterpriseClientIds.findIndex((entry) => entry.serviceBaseUrl === serviceBaseUrl);\r\n if (foundIdx !== -1) {\r\n this._clientIds.enterpriseClientIds[foundIdx].clientId = clientId;\r\n } else {\r\n this._clientIds.enterpriseClientIds.push({ serviceBaseUrl, clientId });\r\n }\r\n } else {\r\n if (this._clientIds === undefined) {\r\n this._clientIds = {};\r\n }\r\n this._clientIds.enterpriseClientIds = [{ serviceBaseUrl, clientId }];\r\n }\r\n }\r\n\r\n public removeEnterpriseClientId(clientId: ArcGisEnterpriseClientId) {\r\n\r\n if (this._clientIds?.enterpriseClientIds) {\r\n this._clientIds.enterpriseClientIds = this._clientIds?.enterpriseClientIds?.filter((item) => item.serviceBaseUrl !== clientId.serviceBaseUrl);\r\n }\r\n\r\n }\r\n\r\n /// //////////\r\n /** @internal */\r\n private async getOAuthTokenForMapLayerUrl(mapLayerUrl: string): Promise<ArcGisOAuth2Token | undefined> {\r\n try {\r\n const oauthEndpoint = await this.getOAuth2Endpoint(mapLayerUrl, ArcGisOAuth2EndpointType.Authorize);\r\n if (oauthEndpoint !== undefined) {\r\n const oauthEndpointUrl = new URL(oauthEndpoint.getUrl());\r\n return ArcGisTokenManager.getOAuth2Token(oauthEndpointUrl.origin);\r\n }\r\n } catch { }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Test if Oauth2 endpoint is accessible and has an associated appId\r\n * @internal\r\n */\r\n private async validateOAuth2Endpoint(endpointUrl: string): Promise<boolean> {\r\n\r\n // Check if we got a matching appId for that endpoint, otherwise its not worth going further\r\n if (undefined === this.getMatchingEnterpriseClientId(endpointUrl)) {\r\n return false;\r\n }\r\n\r\n let status: number | undefined;\r\n try {\r\n const data = await fetch(endpointUrl, { method: \"GET\" });\r\n status = data.status;\r\n } catch (error: any) {\r\n status = error.status;\r\n }\r\n return status === 400; // Oauth2 API returns 400 (Bad Request) when there are missing parameters\r\n }\r\n\r\n // Derive the Oauth URL from a typical MapLayerURL\r\n // i.e. \t https://hostname/server/rest/services/NewYork/NewYork3857/MapServer\r\n // => https://hostname/portal/sharing/oauth2/authorize\r\n private _oauthAuthorizeEndPointsCache = new Map<string, any>();\r\n private _oauthTokenEndPointsCache = new Map<string, any>();\r\n\r\n /**\r\n * Get OAuth2 endpoint that must be cause to get the Oauth2 token\r\n * @internal\r\n */\r\n private async getOAuth2Endpoint(url: string, endpoint: ArcGisOAuth2EndpointType): Promise<ArcGisOAuth2Endpoint | undefined> {\r\n\r\n // Return from cache if available\r\n const cachedEndpoint = (endpoint === ArcGisOAuth2EndpointType.Authorize ? this._oauthAuthorizeEndPointsCache.get(url) : this._oauthTokenEndPointsCache.get(url));\r\n if (cachedEndpoint !== undefined) {\r\n return cachedEndpoint;\r\n }\r\n\r\n const cacheResult = (obj: ArcGisOAuth2Endpoint) => {\r\n if (endpoint === ArcGisOAuth2EndpointType.Authorize) {\r\n this._oauthAuthorizeEndPointsCache.set(url, obj);\r\n } else {\r\n this._oauthTokenEndPointsCache.set(url, obj);\r\n }\r\n };\r\n\r\n const endpointStr = (endpoint === ArcGisOAuth2EndpointType.Authorize ? \"authorize\" : \"token\");\r\n const urlObj = new URL(url);\r\n if (urlObj.hostname.toLowerCase().endsWith(\"arcgis.com\")) {\r\n // ArcGIS Online (fixed)\r\n // Doc: https://developers.arcgis.com/documentation/mapping-apis-and-services/security/oauth-2.0/\r\n\r\n if (this.arcGisOnlineClientId === undefined) {\r\n return undefined;\r\n }\r\n\r\n const oauth2Url = `https://www.arcgis.com/sharing/rest/oauth2/${endpointStr}`;\r\n return new ArcGisOAuth2Endpoint(url, this.constructLoginUrl(oauth2Url, true), true);\r\n } else {\r\n\r\n // First attempt: derive the Oauth2 token URL from the 'tokenServicesUrl', exposed by the 'info request'\r\n let restUrlFromTokenService: URL | undefined;\r\n try {\r\n restUrlFromTokenService = await ArcGisUrl.getRestUrlFromGenerateTokenUrl(urlObj);\r\n } catch { }\r\n\r\n if (restUrlFromTokenService !== undefined) {\r\n // Validate the URL we just composed\r\n try {\r\n const oauth2Url = `${restUrlFromTokenService.toString()}oauth2/${endpointStr}`;\r\n if (await this.validateOAuth2Endpoint(oauth2Url)) {\r\n const oauthEndpoint = new ArcGisOAuth2Endpoint(oauth2Url, this.constructLoginUrl(oauth2Url, false), false);\r\n cacheResult(oauthEndpoint);\r\n return oauthEndpoint;\r\n }\r\n } catch { }\r\n }\r\n\r\n // If reach this point, that means we could not derive the token endpoint from 'tokenServicesUrl'\r\n // lets use another approach.\r\n // ArcGIS Enterprise Format https://<host>:<port>/<subdirectory>/sharing/rest/oauth2/authorize\r\n const regExMatch = url.match(new RegExp(/([^&\\/]+)\\/rest\\/services\\/.*/, \"i\"));\r\n if (regExMatch !== null && regExMatch.length >= 2) {\r\n const subdirectory = regExMatch[1];\r\n const port = (urlObj.port !== \"80\" && urlObj.port !== \"443\") ? `:${urlObj.port}` : \"\";\r\n const newUrlObj = new URL(`${urlObj.protocol}//${urlObj.hostname}${port}/${subdirectory}/sharing/rest/oauth2/${endpointStr}`);\r\n\r\n // Check again the URL we just composed\r\n try {\r\n const newUrl = newUrlObj.toString();\r\n if (await this.validateOAuth2Endpoint(newUrl)) {\r\n const oauthEndpoint = new ArcGisOAuth2Endpoint(newUrl, this.constructLoginUrl(newUrl, false), false);\r\n cacheResult(oauthEndpoint);\r\n return oauthEndpoint;\r\n }\r\n } catch { }\r\n }\r\n\r\n }\r\n return undefined; // we could not find any valid oauth2 endpoint\r\n }\r\n\r\n /**\r\n * Construct the complete Authorize url to starts the Oauth process\r\n * @internal\r\n */\r\n private constructLoginUrl(url: string, isArcgisOnline: boolean) {\r\n const urlObj = new URL(url);\r\n\r\n // Set the client id\r\n if (isArcgisOnline) {\r\n const clientId = this.arcGisOnlineClientId;\r\n assert(clientId !== undefined);\r\n if (clientId !== undefined) {\r\n urlObj.searchParams.set(\"client_id\", clientId);\r\n }\r\n\r\n } else {\r\n const clientId = this.getMatchingEnterpriseClientId(url);\r\n assert(clientId !== undefined);\r\n if (undefined !== clientId) {\r\n urlObj.searchParams.set(\"client_id\", clientId);\r\n }\r\n }\r\n\r\n urlObj.searchParams.set(\"response_type\", \"token\");\r\n if (this.expiration !== undefined) {\r\n urlObj.searchParams.set(\"expiration\", `${this.expiration}`);\r\n }\r\n\r\n if (this.redirectUri)\r\n urlObj.searchParams.set(\"redirect_uri\", this.redirectUri);\r\n\r\n return urlObj.toString();\r\n }\r\n\r\n}\r\n"]}
@@ -0,0 +1,23 @@
1
+ import { MapLayerTokenEndpoint } from "@itwin/core-frontend";
2
+ /** @internal */
3
+ export declare enum ArcGisOAuth2EndpointType {
4
+ Authorize = 0,
5
+ Token = 1
6
+ }
7
+ /** @internal */
8
+ export declare class ArcGisOAuth2Endpoint implements MapLayerTokenEndpoint {
9
+ private _url;
10
+ private _loginUrl;
11
+ private _isArcgisOnline;
12
+ constructor(url: string, loginUrl: string, isArcgisOnline: boolean);
13
+ getUrl(): string;
14
+ /**
15
+ * Returns the URL used to login and generate the Oauth token.
16
+ * @param stateData Custom JSON data that will sent back by once the Oauth process completes
17
+ * @returns Promise resolves after the defaults are setup.
18
+ * @internal
19
+ */
20
+ getLoginUrl(stateData?: any): string;
21
+ get isArcgisOnline(): boolean;
22
+ }
23
+ //# sourceMappingURL=ArcGisOAuth2Endpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisOAuth2Endpoint.d.ts","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisOAuth2Endpoint.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,gBAAgB;AAChB,oBAAY,wBAAwB;IAAE,SAAS,IAAA;IAAC,KAAK,IAAA;CAAC;AAEtD,gBAAgB;AAChB,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAU;gBAErB,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO;IAO3D,MAAM;IAIb;;;;;OAKG;IACI,WAAW,CAAC,SAAS,CAAC,EAAE,GAAG;IAqBlC,IAAW,cAAc,YAAiC;CAE3D"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArcGisOAuth2Endpoint = exports.ArcGisOAuth2EndpointType = void 0;
4
+ /** @internal */
5
+ var ArcGisOAuth2EndpointType;
6
+ (function (ArcGisOAuth2EndpointType) {
7
+ ArcGisOAuth2EndpointType[ArcGisOAuth2EndpointType["Authorize"] = 0] = "Authorize";
8
+ ArcGisOAuth2EndpointType[ArcGisOAuth2EndpointType["Token"] = 1] = "Token";
9
+ })(ArcGisOAuth2EndpointType = exports.ArcGisOAuth2EndpointType || (exports.ArcGisOAuth2EndpointType = {}));
10
+ /** @internal */
11
+ class ArcGisOAuth2Endpoint {
12
+ constructor(url, loginUrl, isArcgisOnline) {
13
+ this._url = url;
14
+ this._loginUrl = loginUrl;
15
+ this._isArcgisOnline = isArcgisOnline;
16
+ }
17
+ // Returns the actual endpoint url
18
+ getUrl() {
19
+ return this._url;
20
+ }
21
+ /**
22
+ * Returns the URL used to login and generate the Oauth token.
23
+ * @param stateData Custom JSON data that will sent back by once the Oauth process completes
24
+ * @returns Promise resolves after the defaults are setup.
25
+ * @internal
26
+ */
27
+ getLoginUrl(stateData) {
28
+ const urlObj = new URL(this._loginUrl);
29
+ const data = {
30
+ endpointOrigin: new URL(this._url).origin,
31
+ customData: stateData, // caller's data
32
+ };
33
+ let stateStr;
34
+ try {
35
+ stateStr = JSON.stringify(data);
36
+ }
37
+ catch {
38
+ }
39
+ if (stateStr !== undefined) {
40
+ urlObj.searchParams.set("state", stateStr);
41
+ }
42
+ return urlObj.toString();
43
+ }
44
+ get isArcgisOnline() { return this._isArcgisOnline; }
45
+ }
46
+ exports.ArcGisOAuth2Endpoint = ArcGisOAuth2Endpoint;
47
+ //# sourceMappingURL=ArcGisOAuth2Endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisOAuth2Endpoint.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisOAuth2Endpoint.ts"],"names":[],"mappings":";;;AAMA,gBAAgB;AAChB,IAAY,wBAA0C;AAAtD,WAAY,wBAAwB;IAAE,iFAAS,CAAA;IAAC,yEAAK,CAAA;AAAA,CAAC,EAA1C,wBAAwB,GAAxB,gCAAwB,KAAxB,gCAAwB,QAAkB;AAEtD,gBAAgB;AAChB,MAAa,oBAAoB;IAK/B,YAAY,GAAW,EAAE,QAAgB,EAAE,cAAuB;QAChE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IACxC,CAAC;IAED,kCAAkC;IAC3B,MAAM;QACX,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACI,WAAW,CAAC,SAAe;QAChC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEvC,MAAM,IAAI,GAAG;YACX,cAAc,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;YACzC,UAAU,EAAE,SAAS,EAAyB,gBAAgB;SAC/D,CAAC;QAEF,IAAI,QAAQ,CAAC;QACb,IAAI;YACF,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SACjC;QAAC,MAAM;SAEP;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;SAC5C;QAED,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED,IAAW,cAAc,KAAI,OAAO,IAAI,CAAC,eAAe,CAAC,CAAA,CAAC;CAE3D;AA7CD,oDA6CC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { MapLayerTokenEndpoint } from \"@itwin/core-frontend\";\r\n\r\n/** @internal */\r\nexport enum ArcGisOAuth2EndpointType {Authorize,Token}\r\n\r\n/** @internal */\r\nexport class ArcGisOAuth2Endpoint implements MapLayerTokenEndpoint {\r\n private _url: string;\r\n private _loginUrl: string;\r\n private _isArcgisOnline: boolean;\r\n\r\n constructor(url: string, loginUrl: string, isArcgisOnline: boolean) {\r\n this._url = url;\r\n this._loginUrl = loginUrl;\r\n this._isArcgisOnline = isArcgisOnline;\r\n }\r\n\r\n // Returns the actual endpoint url\r\n public getUrl() {\r\n return this._url;\r\n }\r\n\r\n /**\r\n * Returns the URL used to login and generate the Oauth token.\r\n * @param stateData Custom JSON data that will sent back by once the Oauth process completes\r\n * @returns Promise resolves after the defaults are setup.\r\n * @internal\r\n */\r\n public getLoginUrl(stateData?: any) {\r\n const urlObj = new URL(this._loginUrl);\r\n\r\n const data = {\r\n endpointOrigin: new URL(this._url).origin, // arcGisOAuth2Callback depends on this\r\n customData: stateData, // caller's data\r\n };\r\n\r\n let stateStr;\r\n try {\r\n stateStr = JSON.stringify(data);\r\n } catch {\r\n\r\n }\r\n if (stateStr !== undefined) {\r\n urlObj.searchParams.set(\"state\", stateStr);\r\n }\r\n\r\n return urlObj.toString();\r\n }\r\n\r\n public get isArcgisOnline() {return this._isArcgisOnline;}\r\n\r\n}\r\n"]}
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ /** @beta */
3
+ export declare function ArcGisOauthRedirect(): JSX.Element;
4
+ //# sourceMappingURL=ArcGisOauthRedirect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisOauthRedirect.d.ts","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisOauthRedirect.tsx"],"names":[],"mappings":";AAOA,YAAY;AAEZ,wBAAgB,mBAAmB,gBAqBlC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArcGisOauthRedirect = void 0;
4
+ /*---------------------------------------------------------------------------------------------
5
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
+ * See LICENSE.md in the project root for license terms and full copyright notice.
7
+ *--------------------------------------------------------------------------------------------*/
8
+ const itwinui_react_1 = require("@itwin/itwinui-react");
9
+ const React = require("react");
10
+ /** @beta */
11
+ // eslint-disable-next-line @typescript-eslint/naming-convention
12
+ function ArcGisOauthRedirect() {
13
+ const completeLogin = () => {
14
+ if (window.opener) {
15
+ const opener = (window.opener);
16
+ if (opener === null || opener === void 0 ? void 0 : opener.arcGisOAuth2Callback) {
17
+ opener.arcGisOAuth2Callback(window.location);
18
+ }
19
+ else {
20
+ // eslint-disable-next-line no-console
21
+ console.log("ERROR: arcGisOAuth2Callback is not defined");
22
+ }
23
+ }
24
+ };
25
+ React.useEffect(() => {
26
+ completeLogin();
27
+ }, []);
28
+ return (React.createElement(itwinui_react_1.ProgressRadial, { indeterminate: true }));
29
+ }
30
+ exports.ArcGisOauthRedirect = ArcGisOauthRedirect;
31
+ //# sourceMappingURL=ArcGisOauthRedirect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisOauthRedirect.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisOauthRedirect.tsx"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F,wDAAsD;AACtD,+BAA+B;AAE/B,YAAY;AACZ,gEAAgE;AAChE,SAAgB,mBAAmB;IAEjC,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,MAAM,CAAC,MAAM,EAAE;YACjB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,oBAAoB,EAAE;gBAChC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;aAC9C;iBAAM;gBACL,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;aAC3D;SACF;IACH,CAAC,CAAC;IAEF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,aAAa,EAAE,CAAC;IAClB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,oBAAC,8BAAc,IAAC,aAAa,EAAE,IAAI,GAAmB,CACvD,CAAC;AACJ,CAAC;AArBD,kDAqBC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { ProgressRadial } from \"@itwin/itwinui-react\";\r\nimport * as React from \"react\";\r\n\r\n/** @beta */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function ArcGisOauthRedirect() {\r\n\r\n const completeLogin = () => {\r\n if (window.opener) {\r\n const opener = (window.opener);\r\n if (opener?.arcGisOAuth2Callback) {\r\n opener.arcGisOAuth2Callback(window.location);\r\n } else {\r\n // eslint-disable-next-line no-console\r\n console.log(\"ERROR: arcGisOAuth2Callback is not defined\");\r\n }\r\n }\r\n };\r\n\r\n React.useEffect(() => {\r\n completeLogin();\r\n }, []);\r\n\r\n return (\r\n <ProgressRadial indeterminate={true}></ProgressRadial>\r\n );\r\n}\r\n"]}
@@ -0,0 +1,42 @@
1
+ import { MapLayerAccessToken } from "@itwin/core-frontend";
2
+ /** @packageDocumentation
3
+ * @module Tiles
4
+ */
5
+ /** @internal */
6
+ export interface ArcGisOAuth2Token extends MapLayerAccessToken {
7
+ expiresAt: number;
8
+ ssl: boolean;
9
+ userName: string;
10
+ persist?: boolean;
11
+ }
12
+ /** @internal */
13
+ export interface ArcGisToken extends MapLayerAccessToken {
14
+ expires: number;
15
+ ssl: boolean;
16
+ }
17
+ /** @internal */
18
+ export declare enum ArcGisTokenClientType {
19
+ ip = 0,
20
+ referer = 1,
21
+ requestIp = 2
22
+ }
23
+ /** @internal */
24
+ export interface ArcGisGenerateTokenOptions {
25
+ client: ArcGisTokenClientType;
26
+ ip?: string;
27
+ referer?: string;
28
+ expiration?: number;
29
+ }
30
+ /** @internal */
31
+ export declare class ArcGisTokenGenerator {
32
+ private static readonly restApiPath;
33
+ private static readonly restApiInfoPath;
34
+ private static _tokenServiceUrlCache;
35
+ static fetchTokenServiceUrl(arcGisRestServiceUrl: string): Promise<string | undefined>;
36
+ static getTokenServiceFromInfoJson(json: any): string | undefined;
37
+ getTokenServiceUrl(baseUrl: string): Promise<string | undefined>;
38
+ generate(arcGisRestServiceUrl: string, userName: string, password: string, options: ArcGisGenerateTokenOptions): Promise<any>;
39
+ static formEncode(str: string): string;
40
+ static rfc1738Encode(str: string): string;
41
+ }
42
+ //# sourceMappingURL=ArcGisTokenGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisTokenGenerator.d.ts","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenGenerator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;GAEG;AAEH,gBAAgB;AAChB,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAG5D,SAAS,EAAE,MAAM,CAAC;IAGlB,GAAG,EAAE,OAAO,CAAC;IAGb,QAAQ,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,gBAAgB;AAChB,MAAM,WAAW,WAAY,SAAQ,mBAAmB;IAEtD,OAAO,EAAE,MAAM,CAAC;IAGhB,GAAG,EAAE,OAAO,CAAC;CACd;AAGD,gBAAgB;AAChB,oBAAY,qBAAqB;IAC/B,EAAE,IAAA;IACF,OAAO,IAAA;IACP,SAAS,IAAA;CACV;AAED,gBAAgB;AAChB,MAAM,WAAW,0BAA0B;IAKzC,MAAM,EAAE,qBAAqB,CAAC;IAK9B,EAAE,CAAC,EAAE,MAAM,CAAC;IAOZ,OAAO,CAAC,EAAE,MAAM,CAAC;IAOjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gBAAgB;AAChB,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAY;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAGzD,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAA6B;WAE7C,oBAAoB,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;WAiBrF,2BAA2B,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,SAAS;IAI3D,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAahE,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,GAAG,CAAC;WAqD5H,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;WAM/B,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAQjD"}