@itwin/map-layers-auth 5.0.0-dev.4 → 5.0.0-dev.40
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/CHANGELOG.md +26 -1
- package/lib/cjs/ArcGis/ArcGisTokenGenerator.js +4 -4
- package/lib/cjs/ArcGis/ArcGisTokenGenerator.js.map +1 -1
- package/lib/cjs/ArcGis/ArcGisTokenManager.js +3 -3
- package/lib/cjs/ArcGis/ArcGisTokenManager.js.map +1 -1
- package/lib/esm/ArcGis/ArcGisTokenGenerator.js +4 -4
- package/lib/esm/ArcGis/ArcGisTokenGenerator.js.map +1 -1
- package/lib/esm/ArcGis/ArcGisTokenManager.js +3 -3
- package/lib/esm/ArcGis/ArcGisTokenManager.js.map +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
# Change Log - @itwin/map-layers-auth
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Mon, 13 Jan 2025 14:09:29 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 4.10.4
|
|
6
|
+
Mon, 13 Jan 2025 14:06:43 GMT
|
|
7
|
+
|
|
8
|
+
_Version update only_
|
|
9
|
+
|
|
10
|
+
## 4.10.3
|
|
11
|
+
Mon, 06 Jan 2025 14:00:13 GMT
|
|
12
|
+
|
|
13
|
+
_Version update only_
|
|
14
|
+
|
|
15
|
+
## 4.10.2
|
|
16
|
+
Thu, 21 Nov 2024 15:22:20 GMT
|
|
17
|
+
|
|
18
|
+
_Version update only_
|
|
19
|
+
|
|
20
|
+
## 4.10.1
|
|
21
|
+
Thu, 14 Nov 2024 18:11:00 GMT
|
|
22
|
+
|
|
23
|
+
_Version update only_
|
|
24
|
+
|
|
25
|
+
## 4.10.0
|
|
26
|
+
Wed, 13 Nov 2024 15:23:39 GMT
|
|
27
|
+
|
|
28
|
+
_Version update only_
|
|
4
29
|
|
|
5
30
|
## 4.9.7
|
|
6
31
|
Wed, 06 Nov 2024 19:23:04 GMT
|
|
@@ -11,6 +11,10 @@ var ArcGisTokenClientType;
|
|
|
11
11
|
})(ArcGisTokenClientType || (exports.ArcGisTokenClientType = ArcGisTokenClientType = {}));
|
|
12
12
|
/** @internal */
|
|
13
13
|
class ArcGisTokenGenerator {
|
|
14
|
+
static { this.restApiPath = "/rest/"; }
|
|
15
|
+
static { this.restApiInfoPath = "info?f=pjson"; }
|
|
16
|
+
// Cache info url to avoid fetching/parsing twice for the same base url.
|
|
17
|
+
static { this._tokenServiceUrlCache = new Map(); }
|
|
14
18
|
static async fetchTokenServiceUrl(arcGisRestServiceUrl) {
|
|
15
19
|
const lowerUrl = arcGisRestServiceUrl.toLowerCase();
|
|
16
20
|
const restApiIdx = lowerUrl.indexOf(ArcGisTokenGenerator.restApiPath);
|
|
@@ -101,8 +105,4 @@ class ArcGisTokenGenerator {
|
|
|
101
105
|
}
|
|
102
106
|
}
|
|
103
107
|
exports.ArcGisTokenGenerator = ArcGisTokenGenerator;
|
|
104
|
-
ArcGisTokenGenerator.restApiPath = "/rest/";
|
|
105
|
-
ArcGisTokenGenerator.restApiInfoPath = "info?f=pjson";
|
|
106
|
-
// Cache info url to avoid fetching/parsing twice for the same base url.
|
|
107
|
-
ArcGisTokenGenerator._tokenServiceUrlCache = new Map();
|
|
108
108
|
//# sourceMappingURL=ArcGisTokenGenerator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArcGisTokenGenerator.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { MapLayerAccessToken } from \"@itwin/core-frontend\";\n\n/** @packageDocumentation\n * @module Tiles\n */\n\n/** @internal */\nexport interface ArcGisOAuth2Token extends MapLayerAccessToken {\n\n // The expiration time of the token in milliseconds (UNIX time)\n expiresAt: number;\n\n // This property will show as true if the token must always pass over ssl.\n ssl: boolean;\n\n // Username associated with this token\n userName: string;\n\n // A Binary value that, if true, implies that the user had checked \"Keep me signed in\"\n persist?: boolean;\n}\n\n/** @internal */\nexport interface ArcGisToken extends MapLayerAccessToken {\n // The expiration time of the token in milliseconds since January 1, 1970 (UTC).\n expires: number;\n\n // This property will show as true if the token must always pass over ssl.\n ssl: boolean;\n}\n\n// client application's base URL, a user-specified IP address, or the IP address that is making the request.\n/** @internal */\nexport enum ArcGisTokenClientType {\n ip,\n referer,\n requestIp,\n}\n\n/** @internal */\nexport interface ArcGisGenerateTokenOptions {\n\n // The client type that will be granted access to the token.\n // Users will be able to specify whether the token will be generated for a client application's base URL,\n // a user-specified IP address, or the IP address that is making the request.\n client: ArcGisTokenClientType;\n\n // The IP address that will be using the created token for access.\n // On the Generate Token page, the IP address is specified in the IP Address field. This is required when client has been set as ip.\n // Example ip=11.11.111.111\n ip?: string;\n\n // The base URL of the client application that will use the token.\n // On the Generate Token page, the referrer URL is specified in the Webapp URL field.\n // Defaults to location.origin if undefined and client = referer.\n // This is required when client has been set as referer.\n // Example : referer=https://myserver/mywebapp\n referer?: string;\n\n // The token expiration time in minutes. The default is 60 minutes (one hour).\n // The maximum expiration period is 15 days. The maximum value of the expiration time is controlled by the server.\n // Requests for tokens larger than this time will be rejected.\n // Applications are responsible for renewing expired tokens;\n // expired tokens will be rejected by the server on subsequent requests that use the token.\n expiration?: number; // in minutes, defaults to 60 minutes\n}\n\n/** @internal */\nexport class ArcGisTokenGenerator {\n private static readonly restApiPath = \"/rest/\";\n private static readonly restApiInfoPath = \"info?f=pjson\";\n\n // Cache info url to avoid fetching/parsing twice for the same base url.\n private static _tokenServiceUrlCache = new Map<string, string>();\n\n public static async fetchTokenServiceUrl(arcGisRestServiceUrl: string): Promise<string | undefined> {\n const lowerUrl = arcGisRestServiceUrl.toLowerCase();\n const restApiIdx = lowerUrl.indexOf(ArcGisTokenGenerator.restApiPath);\n if (restApiIdx === -1)\n return undefined;\n const infoUrl = arcGisRestServiceUrl.substring(0, restApiIdx + ArcGisTokenGenerator.restApiPath.length) + ArcGisTokenGenerator.restApiInfoPath;\n\n let tokenServicesUrl: string | undefined;\n try {\n const response = await fetch(infoUrl, { method: \"GET\" });\n const json = await response.json();\n tokenServicesUrl = ArcGisTokenGenerator.getTokenServiceFromInfoJson(json);\n } catch { }\n return tokenServicesUrl;\n }\n\n public static getTokenServiceFromInfoJson(json: any): string | undefined {\n return json.authInfo?.isTokenBasedSecurity ? json?.authInfo?.tokenServicesUrl : undefined;\n }\n\n public async getTokenServiceUrl(baseUrl: string): Promise<string | undefined> {\n const cached = ArcGisTokenGenerator._tokenServiceUrlCache.get(baseUrl);\n if (cached !== undefined)\n return cached;\n\n const tokenServiceUrl = await ArcGisTokenGenerator.fetchTokenServiceUrl(baseUrl);\n if (tokenServiceUrl !== undefined)\n ArcGisTokenGenerator._tokenServiceUrlCache.set(baseUrl, tokenServiceUrl);\n\n return tokenServiceUrl;\n }\n\n // base url: ArcGis REST service base URL (format must be \"https://<host>/<instance>/rest/\")\n public async generate(arcGisRestServiceUrl: string, userName: string, password: string, options: ArcGisGenerateTokenOptions): Promise<any> {\n const tokenServiceUrl = await this.getTokenServiceUrl(arcGisRestServiceUrl);\n if (!tokenServiceUrl)\n return undefined;\n\n let token: undefined;\n try {\n const encodedUsername = encodeURIComponent(userName);\n const encodedPassword = encodeURIComponent(password);\n\n // Compose the expiration param\n let expirationStr = \"\";\n if (options.expiration) {\n expirationStr = `&expiration=${options.expiration}`;\n }\n\n // Compose the client param\n let clientStr = \"\";\n if (options.client === ArcGisTokenClientType.referer) {\n let refererStr = \"\";\n if (options.referer === undefined) {\n refererStr = encodeURIComponent(location.origin); // default to application origin\n } else {\n refererStr = encodeURIComponent(options.referer);\n }\n\n clientStr = `&client=referer&referer=${refererStr}`;\n } else if (options.client === ArcGisTokenClientType.ip) {\n if (options.ip === undefined)\n return token;\n clientStr = `&client=ip&ip=${options.ip}`;\n } else if (options.client === ArcGisTokenClientType.requestIp) {\n clientStr = `&client=requestip&ip=`;\n }\n\n const httpRequestOptions: RequestInit = {\n method: \"POST\",\n body: `username=${encodedUsername}&password=${encodedPassword}${clientStr}${expirationStr}&f=pjson`,\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n };\n\n const response = await fetch(tokenServiceUrl, httpRequestOptions);\n\n // Check a token was really generated (an error could be part of the body)\n token = await response.json();\n\n } catch { }\n return token;\n }\n\n // Encode following 'application/x-www-form-urlencoded' standard (https://www.w3.org/TR/html401/interact/forms.html#h-17.13.3.3)\n // Also mentioned here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n public static formEncode(str: string): string {\n return ArcGisTokenGenerator.rfc1738Encode(str).replace(/%20/g, \"+\");\n }\n\n // Encode following RFC1738 standard (https://www.ietf.org/rfc/rfc1738.txt)\n // Code from https://locutus.io/php/url/rawurlencode/\n public static rfc1738Encode(str: string): string {\n return encodeURIComponent(str)\n .replace(/!/g, \"%21\")\n .replace(/'/g, \"%27\")\n .replace(/\\(/g, \"%28\")\n .replace(/\\)/g, \"%29\")\n .replace(/\\*/g, \"%2A\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ArcGisTokenGenerator.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { MapLayerAccessToken } from \"@itwin/core-frontend\";\n\n/** @packageDocumentation\n * @module Tiles\n */\n\n/** @internal */\nexport interface ArcGisOAuth2Token extends MapLayerAccessToken {\n\n // The expiration time of the token in milliseconds (UNIX time)\n expiresAt: number;\n\n // This property will show as true if the token must always pass over ssl.\n ssl: boolean;\n\n // Username associated with this token\n userName: string;\n\n // A Binary value that, if true, implies that the user had checked \"Keep me signed in\"\n persist?: boolean;\n}\n\n/** @internal */\nexport interface ArcGisToken extends MapLayerAccessToken {\n // The expiration time of the token in milliseconds since January 1, 1970 (UTC).\n expires: number;\n\n // This property will show as true if the token must always pass over ssl.\n ssl: boolean;\n}\n\n// client application's base URL, a user-specified IP address, or the IP address that is making the request.\n/** @internal */\nexport enum ArcGisTokenClientType {\n ip,\n referer,\n requestIp,\n}\n\n/** @internal */\nexport interface ArcGisGenerateTokenOptions {\n\n // The client type that will be granted access to the token.\n // Users will be able to specify whether the token will be generated for a client application's base URL,\n // a user-specified IP address, or the IP address that is making the request.\n client: ArcGisTokenClientType;\n\n // The IP address that will be using the created token for access.\n // On the Generate Token page, the IP address is specified in the IP Address field. This is required when client has been set as ip.\n // Example ip=11.11.111.111\n ip?: string;\n\n // The base URL of the client application that will use the token.\n // On the Generate Token page, the referrer URL is specified in the Webapp URL field.\n // Defaults to location.origin if undefined and client = referer.\n // This is required when client has been set as referer.\n // Example : referer=https://myserver/mywebapp\n referer?: string;\n\n // The token expiration time in minutes. The default is 60 minutes (one hour).\n // The maximum expiration period is 15 days. The maximum value of the expiration time is controlled by the server.\n // Requests for tokens larger than this time will be rejected.\n // Applications are responsible for renewing expired tokens;\n // expired tokens will be rejected by the server on subsequent requests that use the token.\n expiration?: number; // in minutes, defaults to 60 minutes\n}\n\n/** @internal */\nexport class ArcGisTokenGenerator {\n private static readonly restApiPath = \"/rest/\";\n private static readonly restApiInfoPath = \"info?f=pjson\";\n\n // Cache info url to avoid fetching/parsing twice for the same base url.\n private static _tokenServiceUrlCache = new Map<string, string>();\n\n public static async fetchTokenServiceUrl(arcGisRestServiceUrl: string): Promise<string | undefined> {\n const lowerUrl = arcGisRestServiceUrl.toLowerCase();\n const restApiIdx = lowerUrl.indexOf(ArcGisTokenGenerator.restApiPath);\n if (restApiIdx === -1)\n return undefined;\n const infoUrl = arcGisRestServiceUrl.substring(0, restApiIdx + ArcGisTokenGenerator.restApiPath.length) + ArcGisTokenGenerator.restApiInfoPath;\n\n let tokenServicesUrl: string | undefined;\n try {\n const response = await fetch(infoUrl, { method: \"GET\" });\n const json = await response.json();\n tokenServicesUrl = ArcGisTokenGenerator.getTokenServiceFromInfoJson(json);\n } catch { }\n return tokenServicesUrl;\n }\n\n public static getTokenServiceFromInfoJson(json: any): string | undefined {\n return json.authInfo?.isTokenBasedSecurity ? json?.authInfo?.tokenServicesUrl : undefined;\n }\n\n public async getTokenServiceUrl(baseUrl: string): Promise<string | undefined> {\n const cached = ArcGisTokenGenerator._tokenServiceUrlCache.get(baseUrl);\n if (cached !== undefined)\n return cached;\n\n const tokenServiceUrl = await ArcGisTokenGenerator.fetchTokenServiceUrl(baseUrl);\n if (tokenServiceUrl !== undefined)\n ArcGisTokenGenerator._tokenServiceUrlCache.set(baseUrl, tokenServiceUrl);\n\n return tokenServiceUrl;\n }\n\n // base url: ArcGis REST service base URL (format must be \"https://<host>/<instance>/rest/\")\n public async generate(arcGisRestServiceUrl: string, userName: string, password: string, options: ArcGisGenerateTokenOptions): Promise<any> {\n const tokenServiceUrl = await this.getTokenServiceUrl(arcGisRestServiceUrl);\n if (!tokenServiceUrl)\n return undefined;\n\n let token: undefined;\n try {\n const encodedUsername = encodeURIComponent(userName);\n const encodedPassword = encodeURIComponent(password);\n\n // Compose the expiration param\n let expirationStr = \"\";\n if (options.expiration) {\n expirationStr = `&expiration=${options.expiration}`;\n }\n\n // Compose the client param\n let clientStr = \"\";\n if (options.client === ArcGisTokenClientType.referer) {\n let refererStr = \"\";\n if (options.referer === undefined) {\n refererStr = encodeURIComponent(location.origin); // default to application origin\n } else {\n refererStr = encodeURIComponent(options.referer);\n }\n\n clientStr = `&client=referer&referer=${refererStr}`;\n } else if (options.client === ArcGisTokenClientType.ip) {\n if (options.ip === undefined)\n return token;\n clientStr = `&client=ip&ip=${options.ip}`;\n } else if (options.client === ArcGisTokenClientType.requestIp) {\n clientStr = `&client=requestip&ip=`;\n }\n\n const httpRequestOptions: RequestInit = {\n method: \"POST\",\n body: `username=${encodedUsername}&password=${encodedPassword}${clientStr}${expirationStr}&f=pjson`,\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n };\n\n const response = await fetch(tokenServiceUrl, httpRequestOptions);\n\n // Check a token was really generated (an error could be part of the body)\n token = await response.json();\n\n } catch { }\n return token;\n }\n\n // Encode following 'application/x-www-form-urlencoded' standard (https://www.w3.org/TR/html401/interact/forms.html#h-17.13.3.3)\n // Also mentioned here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n public static formEncode(str: string): string {\n return ArcGisTokenGenerator.rfc1738Encode(str).replace(/%20/g, \"+\");\n }\n\n // Encode following RFC1738 standard (https://www.ietf.org/rfc/rfc1738.txt)\n // Code from https://locutus.io/php/url/rawurlencode/\n public static rfc1738Encode(str: string): string {\n return encodeURIComponent(str)\n .replace(/!/g, \"%21\")\n .replace(/'/g, \"%27\")\n .replace(/\\(/g, \"%28\")\n .replace(/\\)/g, \"%29\")\n .replace(/\\*/g, \"%2A\");\n }\n}\n"]}
|
|
@@ -11,6 +11,9 @@ exports.ArcGisTokenManager = void 0;
|
|
|
11
11
|
const ArcGisTokenGenerator_1 = require("./ArcGisTokenGenerator");
|
|
12
12
|
/** @internal */
|
|
13
13
|
class ArcGisTokenManager {
|
|
14
|
+
static { this.tokenExpiryThreshold = 300000; } // 5 minutes in milliseconds
|
|
15
|
+
static { this._cache = new Map(); }
|
|
16
|
+
static { this._browserStorageKey = "arcGisOAuth"; }
|
|
14
17
|
static async getToken(arcGisRestServiceUrl, userName, password, options) {
|
|
15
18
|
if (!ArcGisTokenManager._generator)
|
|
16
19
|
ArcGisTokenManager._generator = new ArcGisTokenGenerator_1.ArcGisTokenGenerator();
|
|
@@ -106,7 +109,4 @@ class ArcGisTokenManager {
|
|
|
106
109
|
}
|
|
107
110
|
}
|
|
108
111
|
exports.ArcGisTokenManager = ArcGisTokenManager;
|
|
109
|
-
ArcGisTokenManager.tokenExpiryThreshold = 300000; // 5 minutes in milliseconds
|
|
110
|
-
ArcGisTokenManager._cache = new Map();
|
|
111
|
-
ArcGisTokenManager._browserStorageKey = "arcGisOAuth";
|
|
112
112
|
//# sourceMappingURL=ArcGisTokenManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArcGisTokenManager.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenManager.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAGH,iEAA0H;AAO1H,gBAAgB;AAChB,MAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"ArcGisTokenManager.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Tiles\n */\n\nimport { MapLayerAccessToken } from \"@itwin/core-frontend\";\nimport { ArcGisGenerateTokenOptions, ArcGisOAuth2Token, ArcGisToken, ArcGisTokenGenerator } from \"./ArcGisTokenGenerator\";\n\n/** @internal */\ninterface ArcGisTokenProps {\n [hostname: string]: ArcGisOAuth2Token;\n}\n\n/** @internal */\nexport class ArcGisTokenManager {\n private static readonly tokenExpiryThreshold = 300000; // 5 minutes in milliseconds\n private static _cache = new Map<string, ArcGisToken>();\n private static _oauth2Cache: Map<string, ArcGisOAuth2Token> | undefined;\n private static _generator: ArcGisTokenGenerator | undefined;\n private static readonly _browserStorageKey = \"arcGisOAuth\";\n\n public static async getToken(arcGisRestServiceUrl: string, userName: string, password: string, options: ArcGisGenerateTokenOptions): Promise<ArcGisToken | undefined> {\n if (!ArcGisTokenManager._generator)\n ArcGisTokenManager._generator = new ArcGisTokenGenerator();\n\n const tokenCacheKey = `${encodeURIComponent(userName)}@${arcGisRestServiceUrl}`;\n\n // First check in the session cache\n const cachedToken = ArcGisTokenManager._cache.get(tokenCacheKey);\n\n // Check if token is in cached and is valid within the threshold, if not, generate a new token immediately.\n if (cachedToken !== undefined && (cachedToken.expires - (+new Date()) > ArcGisTokenManager.tokenExpiryThreshold)) {\n return cachedToken;\n }\n\n // Nothing in cache, generate a new token\n const newToken = await ArcGisTokenManager._generator.generate(arcGisRestServiceUrl, userName, password, options);\n if (newToken.token) {\n const token = newToken as ArcGisToken;\n ArcGisTokenManager._cache.set(tokenCacheKey, token);\n return token;\n }\n\n return undefined;\n }\n\n public static invalidateToken(token: MapLayerAccessToken): boolean {\n\n for (const [key, value] of ArcGisTokenManager._cache) {\n if (value.token === token.token)\n return ArcGisTokenManager._cache.delete(key);\n }\n\n return false;\n }\n\n public static getOAuth2Token(key: string): ArcGisOAuth2Token | undefined {\n if (ArcGisTokenManager._oauth2Cache === undefined) {\n ArcGisTokenManager._oauth2Cache = new Map<string, ArcGisOAuth2Token>();\n ArcGisTokenManager.loadFromBrowserStorage();\n }\n\n const cachedToken = ArcGisTokenManager._oauth2Cache.get(key);\n\n // If cached token has expired (or about to expire), invalidate don't return it.\n if (cachedToken !== undefined && (cachedToken.expiresAt - (+new Date()) < ArcGisTokenManager.tokenExpiryThreshold)) {\n ArcGisTokenManager._oauth2Cache.delete(key);\n return undefined;\n }\n\n return cachedToken;\n }\n\n public static invalidateOAuth2Token(token: MapLayerAccessToken) {\n\n if (ArcGisTokenManager._oauth2Cache) {\n for (const [key, value] of ArcGisTokenManager._oauth2Cache) {\n if (value.token === token.token){\n const deleted = ArcGisTokenManager._oauth2Cache.delete(key);\n ArcGisTokenManager.saveToBrowserStorage();\n return deleted;\n }\n }\n }\n\n return false;\n }\n\n public static setOAuth2Token(key: string, token: ArcGisOAuth2Token) {\n\n if (ArcGisTokenManager._oauth2Cache === undefined) {\n ArcGisTokenManager._oauth2Cache = new Map<string, ArcGisOAuth2Token>();\n\n }\n ArcGisTokenManager._oauth2Cache.set(key, token);\n\n ArcGisTokenManager.saveToBrowserStorage();\n }\n\n public static loadFromBrowserStorage() {\n if (ArcGisTokenManager._oauth2Cache === undefined) {\n return;\n }\n\n const loadEntries = (json: string | undefined) => {\n if (json && ArcGisTokenManager._oauth2Cache !== undefined) {\n const tokens: ArcGisTokenProps | undefined = JSON.parse(json);\n if (tokens) {\n for (const [key, value] of Object.entries(tokens)) {\n ArcGisTokenManager._oauth2Cache.set(key, value);\n }\n }\n }\n };\n\n loadEntries(window.sessionStorage.getItem(this._browserStorageKey) ?? undefined);\n loadEntries(window.localStorage.getItem(this._browserStorageKey) ?? undefined);\n }\n\n public static saveToBrowserStorage() {\n\n if (ArcGisTokenManager._oauth2Cache === undefined) {\n return;\n }\n const sessionTokens: ArcGisTokenProps = {};\n const storageTokens: ArcGisTokenProps = {};\n\n ArcGisTokenManager._oauth2Cache.forEach((value: ArcGisOAuth2Token, key: string) => {\n // ignore the persist flag for now, and only save to session storage\n // if (value.persist === true) {\n // storageTokens[key] = value;\n // } else {\n // sessionTokens[key] = value;\n // }\n sessionTokens[key] = value;\n });\n window.sessionStorage.setItem(this._browserStorageKey, JSON.stringify(sessionTokens));\n window.localStorage.setItem(this._browserStorageKey, JSON.stringify(storageTokens));\n }\n\n}\n"]}
|
|
@@ -8,6 +8,10 @@ export var ArcGisTokenClientType;
|
|
|
8
8
|
})(ArcGisTokenClientType || (ArcGisTokenClientType = {}));
|
|
9
9
|
/** @internal */
|
|
10
10
|
export class ArcGisTokenGenerator {
|
|
11
|
+
static { this.restApiPath = "/rest/"; }
|
|
12
|
+
static { this.restApiInfoPath = "info?f=pjson"; }
|
|
13
|
+
// Cache info url to avoid fetching/parsing twice for the same base url.
|
|
14
|
+
static { this._tokenServiceUrlCache = new Map(); }
|
|
11
15
|
static async fetchTokenServiceUrl(arcGisRestServiceUrl) {
|
|
12
16
|
const lowerUrl = arcGisRestServiceUrl.toLowerCase();
|
|
13
17
|
const restApiIdx = lowerUrl.indexOf(ArcGisTokenGenerator.restApiPath);
|
|
@@ -97,8 +101,4 @@ export class ArcGisTokenGenerator {
|
|
|
97
101
|
.replace(/\*/g, "%2A");
|
|
98
102
|
}
|
|
99
103
|
}
|
|
100
|
-
ArcGisTokenGenerator.restApiPath = "/rest/";
|
|
101
|
-
ArcGisTokenGenerator.restApiInfoPath = "info?f=pjson";
|
|
102
|
-
// Cache info url to avoid fetching/parsing twice for the same base url.
|
|
103
|
-
ArcGisTokenGenerator._tokenServiceUrlCache = new Map();
|
|
104
104
|
//# sourceMappingURL=ArcGisTokenGenerator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArcGisTokenGenerator.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenGenerator.ts"],"names":[],"mappings":"AAmCA,4GAA4G;AAC5G,gBAAgB;AAChB,MAAM,CAAN,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,6DAAE,CAAA;IACF,uEAAO,CAAA;IACP,2EAAS,CAAA;AACX,CAAC,EAJW,qBAAqB,KAArB,qBAAqB,QAIhC;AA8BD,gBAAgB;AAChB,MAAM,OAAO,oBAAoB;IAOxB,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,oBAA4B;QACnE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,UAAU,KAAK,CAAC,CAAC;YACnB,OAAO,SAAS,CAAC;QACnB,MAAM,OAAO,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,oBAAoB,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,oBAAoB,CAAC,eAAe,CAAC;QAE/I,IAAI,gBAAoC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,gBAAgB,GAAG,oBAAoB,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QACX,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAC,2BAA2B,CAAC,IAAS;QACjD,OAAO,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,OAAe;QAC7C,MAAM,MAAM,GAAG,oBAAoB,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvE,IAAI,MAAM,KAAK,SAAS;YACtB,OAAO,MAAM,CAAC;QAEhB,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACjF,IAAI,eAAe,KAAK,SAAS;YAC/B,oBAAoB,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAE3E,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,6FAA6F;IACtF,KAAK,CAAC,QAAQ,CAAC,oBAA4B,EAAE,QAAgB,EAAE,QAAgB,EAAE,OAAmC;QACzH,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;QAC5E,IAAI,CAAC,eAAe;YAClB,OAAO,SAAS,CAAC;QAEnB,IAAI,KAAgB,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAErD,+BAA+B;YAC/B,IAAI,aAAa,GAAG,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,aAAa,GAAG,eAAe,OAAO,CAAC,UAAU,EAAE,CAAC;YACtD,CAAC;YAED,2BAA2B;YAC3B,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,OAAO,EAAE,CAAC;gBACrD,IAAI,UAAU,GAAG,EAAE,CAAC;gBACpB,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAClC,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAK,gCAAgC;gBACxF,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnD,CAAC;gBAED,SAAS,GAAG,2BAA2B,UAAU,EAAE,CAAC;YACtD,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,EAAE,EAAE,CAAC;gBACvD,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS;oBAC1B,OAAO,KAAK,CAAC;gBACf,SAAS,GAAG,iBAAiB,OAAO,CAAC,EAAE,EAAE,CAAC;YAC5C,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,SAAS,EAAE,CAAC;gBAC9D,SAAS,GAAG,uBAAuB,CAAC;YACtC,CAAC;YAED,MAAM,kBAAkB,GAAgB;gBACtC,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,YAAY,eAAe,aAAa,eAAe,GAAG,SAAS,GAAG,aAAa,UAAU;gBACnG,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;aACjE,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;YAElE,0EAA0E;YAC1E,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEhC,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gIAAgI;IAChI,2HAA2H;IACpH,MAAM,CAAC,UAAU,CAAC,GAAW;QAClC,OAAO,oBAAoB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,2EAA2E;IAC3E,qDAAqD;IAC9C,MAAM,CAAC,aAAa,CAAC,GAAW;QACrC,OAAO,kBAAkB,CAAC,GAAG,CAAC;aAC3B,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;;AAxGuB,gCAAW,GAAG,QAAQ,CAAC;AACvB,oCAAe,GAAG,cAAc,CAAC;AAEzD,wEAAwE;AACzD,0CAAqB,GAAG,IAAI,GAAG,EAAkB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { MapLayerAccessToken } from \"@itwin/core-frontend\";\n\n/** @packageDocumentation\n * @module Tiles\n */\n\n/** @internal */\nexport interface ArcGisOAuth2Token extends MapLayerAccessToken {\n\n // The expiration time of the token in milliseconds (UNIX time)\n expiresAt: number;\n\n // This property will show as true if the token must always pass over ssl.\n ssl: boolean;\n\n // Username associated with this token\n userName: string;\n\n // A Binary value that, if true, implies that the user had checked \"Keep me signed in\"\n persist?: boolean;\n}\n\n/** @internal */\nexport interface ArcGisToken extends MapLayerAccessToken {\n // The expiration time of the token in milliseconds since January 1, 1970 (UTC).\n expires: number;\n\n // This property will show as true if the token must always pass over ssl.\n ssl: boolean;\n}\n\n// client application's base URL, a user-specified IP address, or the IP address that is making the request.\n/** @internal */\nexport enum ArcGisTokenClientType {\n ip,\n referer,\n requestIp,\n}\n\n/** @internal */\nexport interface ArcGisGenerateTokenOptions {\n\n // The client type that will be granted access to the token.\n // Users will be able to specify whether the token will be generated for a client application's base URL,\n // a user-specified IP address, or the IP address that is making the request.\n client: ArcGisTokenClientType;\n\n // The IP address that will be using the created token for access.\n // On the Generate Token page, the IP address is specified in the IP Address field. This is required when client has been set as ip.\n // Example ip=11.11.111.111\n ip?: string;\n\n // The base URL of the client application that will use the token.\n // On the Generate Token page, the referrer URL is specified in the Webapp URL field.\n // Defaults to location.origin if undefined and client = referer.\n // This is required when client has been set as referer.\n // Example : referer=https://myserver/mywebapp\n referer?: string;\n\n // The token expiration time in minutes. The default is 60 minutes (one hour).\n // The maximum expiration period is 15 days. The maximum value of the expiration time is controlled by the server.\n // Requests for tokens larger than this time will be rejected.\n // Applications are responsible for renewing expired tokens;\n // expired tokens will be rejected by the server on subsequent requests that use the token.\n expiration?: number; // in minutes, defaults to 60 minutes\n}\n\n/** @internal */\nexport class ArcGisTokenGenerator {\n private static readonly restApiPath = \"/rest/\";\n private static readonly restApiInfoPath = \"info?f=pjson\";\n\n // Cache info url to avoid fetching/parsing twice for the same base url.\n private static _tokenServiceUrlCache = new Map<string, string>();\n\n public static async fetchTokenServiceUrl(arcGisRestServiceUrl: string): Promise<string | undefined> {\n const lowerUrl = arcGisRestServiceUrl.toLowerCase();\n const restApiIdx = lowerUrl.indexOf(ArcGisTokenGenerator.restApiPath);\n if (restApiIdx === -1)\n return undefined;\n const infoUrl = arcGisRestServiceUrl.substring(0, restApiIdx + ArcGisTokenGenerator.restApiPath.length) + ArcGisTokenGenerator.restApiInfoPath;\n\n let tokenServicesUrl: string | undefined;\n try {\n const response = await fetch(infoUrl, { method: \"GET\" });\n const json = await response.json();\n tokenServicesUrl = ArcGisTokenGenerator.getTokenServiceFromInfoJson(json);\n } catch { }\n return tokenServicesUrl;\n }\n\n public static getTokenServiceFromInfoJson(json: any): string | undefined {\n return json.authInfo?.isTokenBasedSecurity ? json?.authInfo?.tokenServicesUrl : undefined;\n }\n\n public async getTokenServiceUrl(baseUrl: string): Promise<string | undefined> {\n const cached = ArcGisTokenGenerator._tokenServiceUrlCache.get(baseUrl);\n if (cached !== undefined)\n return cached;\n\n const tokenServiceUrl = await ArcGisTokenGenerator.fetchTokenServiceUrl(baseUrl);\n if (tokenServiceUrl !== undefined)\n ArcGisTokenGenerator._tokenServiceUrlCache.set(baseUrl, tokenServiceUrl);\n\n return tokenServiceUrl;\n }\n\n // base url: ArcGis REST service base URL (format must be \"https://<host>/<instance>/rest/\")\n public async generate(arcGisRestServiceUrl: string, userName: string, password: string, options: ArcGisGenerateTokenOptions): Promise<any> {\n const tokenServiceUrl = await this.getTokenServiceUrl(arcGisRestServiceUrl);\n if (!tokenServiceUrl)\n return undefined;\n\n let token: undefined;\n try {\n const encodedUsername = encodeURIComponent(userName);\n const encodedPassword = encodeURIComponent(password);\n\n // Compose the expiration param\n let expirationStr = \"\";\n if (options.expiration) {\n expirationStr = `&expiration=${options.expiration}`;\n }\n\n // Compose the client param\n let clientStr = \"\";\n if (options.client === ArcGisTokenClientType.referer) {\n let refererStr = \"\";\n if (options.referer === undefined) {\n refererStr = encodeURIComponent(location.origin); // default to application origin\n } else {\n refererStr = encodeURIComponent(options.referer);\n }\n\n clientStr = `&client=referer&referer=${refererStr}`;\n } else if (options.client === ArcGisTokenClientType.ip) {\n if (options.ip === undefined)\n return token;\n clientStr = `&client=ip&ip=${options.ip}`;\n } else if (options.client === ArcGisTokenClientType.requestIp) {\n clientStr = `&client=requestip&ip=`;\n }\n\n const httpRequestOptions: RequestInit = {\n method: \"POST\",\n body: `username=${encodedUsername}&password=${encodedPassword}${clientStr}${expirationStr}&f=pjson`,\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n };\n\n const response = await fetch(tokenServiceUrl, httpRequestOptions);\n\n // Check a token was really generated (an error could be part of the body)\n token = await response.json();\n\n } catch { }\n return token;\n }\n\n // Encode following 'application/x-www-form-urlencoded' standard (https://www.w3.org/TR/html401/interact/forms.html#h-17.13.3.3)\n // Also mentioned here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n public static formEncode(str: string): string {\n return ArcGisTokenGenerator.rfc1738Encode(str).replace(/%20/g, \"+\");\n }\n\n // Encode following RFC1738 standard (https://www.ietf.org/rfc/rfc1738.txt)\n // Code from https://locutus.io/php/url/rawurlencode/\n public static rfc1738Encode(str: string): string {\n return encodeURIComponent(str)\n .replace(/!/g, \"%21\")\n .replace(/'/g, \"%27\")\n .replace(/\\(/g, \"%28\")\n .replace(/\\)/g, \"%29\")\n .replace(/\\*/g, \"%2A\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ArcGisTokenGenerator.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenGenerator.ts"],"names":[],"mappings":"AAmCA,4GAA4G;AAC5G,gBAAgB;AAChB,MAAM,CAAN,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,6DAAE,CAAA;IACF,uEAAO,CAAA;IACP,2EAAS,CAAA;AACX,CAAC,EAJW,qBAAqB,KAArB,qBAAqB,QAIhC;AA8BD,gBAAgB;AAChB,MAAM,OAAO,oBAAoB;aACP,gBAAW,GAAG,QAAQ,CAAC;aACvB,oBAAe,GAAG,cAAc,CAAC;IAEzD,wEAAwE;aACzD,0BAAqB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1D,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,oBAA4B;QACnE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,UAAU,KAAK,CAAC,CAAC;YACnB,OAAO,SAAS,CAAC;QACnB,MAAM,OAAO,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,oBAAoB,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,oBAAoB,CAAC,eAAe,CAAC;QAE/I,IAAI,gBAAoC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,gBAAgB,GAAG,oBAAoB,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QACX,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAC,2BAA2B,CAAC,IAAS;QACjD,OAAO,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,OAAe;QAC7C,MAAM,MAAM,GAAG,oBAAoB,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvE,IAAI,MAAM,KAAK,SAAS;YACtB,OAAO,MAAM,CAAC;QAEhB,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACjF,IAAI,eAAe,KAAK,SAAS;YAC/B,oBAAoB,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAE3E,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,6FAA6F;IACtF,KAAK,CAAC,QAAQ,CAAC,oBAA4B,EAAE,QAAgB,EAAE,QAAgB,EAAE,OAAmC;QACzH,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;QAC5E,IAAI,CAAC,eAAe;YAClB,OAAO,SAAS,CAAC;QAEnB,IAAI,KAAgB,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAErD,+BAA+B;YAC/B,IAAI,aAAa,GAAG,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,aAAa,GAAG,eAAe,OAAO,CAAC,UAAU,EAAE,CAAC;YACtD,CAAC;YAED,2BAA2B;YAC3B,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,OAAO,EAAE,CAAC;gBACrD,IAAI,UAAU,GAAG,EAAE,CAAC;gBACpB,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAClC,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAK,gCAAgC;gBACxF,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnD,CAAC;gBAED,SAAS,GAAG,2BAA2B,UAAU,EAAE,CAAC;YACtD,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,EAAE,EAAE,CAAC;gBACvD,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS;oBAC1B,OAAO,KAAK,CAAC;gBACf,SAAS,GAAG,iBAAiB,OAAO,CAAC,EAAE,EAAE,CAAC;YAC5C,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,SAAS,EAAE,CAAC;gBAC9D,SAAS,GAAG,uBAAuB,CAAC;YACtC,CAAC;YAED,MAAM,kBAAkB,GAAgB;gBACtC,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,YAAY,eAAe,aAAa,eAAe,GAAG,SAAS,GAAG,aAAa,UAAU;gBACnG,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;aACjE,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;YAElE,0EAA0E;YAC1E,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEhC,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gIAAgI;IAChI,2HAA2H;IACpH,MAAM,CAAC,UAAU,CAAC,GAAW;QAClC,OAAO,oBAAoB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,2EAA2E;IAC3E,qDAAqD;IAC9C,MAAM,CAAC,aAAa,CAAC,GAAW;QACrC,OAAO,kBAAkB,CAAC,GAAG,CAAC;aAC3B,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { MapLayerAccessToken } from \"@itwin/core-frontend\";\n\n/** @packageDocumentation\n * @module Tiles\n */\n\n/** @internal */\nexport interface ArcGisOAuth2Token extends MapLayerAccessToken {\n\n // The expiration time of the token in milliseconds (UNIX time)\n expiresAt: number;\n\n // This property will show as true if the token must always pass over ssl.\n ssl: boolean;\n\n // Username associated with this token\n userName: string;\n\n // A Binary value that, if true, implies that the user had checked \"Keep me signed in\"\n persist?: boolean;\n}\n\n/** @internal */\nexport interface ArcGisToken extends MapLayerAccessToken {\n // The expiration time of the token in milliseconds since January 1, 1970 (UTC).\n expires: number;\n\n // This property will show as true if the token must always pass over ssl.\n ssl: boolean;\n}\n\n// client application's base URL, a user-specified IP address, or the IP address that is making the request.\n/** @internal */\nexport enum ArcGisTokenClientType {\n ip,\n referer,\n requestIp,\n}\n\n/** @internal */\nexport interface ArcGisGenerateTokenOptions {\n\n // The client type that will be granted access to the token.\n // Users will be able to specify whether the token will be generated for a client application's base URL,\n // a user-specified IP address, or the IP address that is making the request.\n client: ArcGisTokenClientType;\n\n // The IP address that will be using the created token for access.\n // On the Generate Token page, the IP address is specified in the IP Address field. This is required when client has been set as ip.\n // Example ip=11.11.111.111\n ip?: string;\n\n // The base URL of the client application that will use the token.\n // On the Generate Token page, the referrer URL is specified in the Webapp URL field.\n // Defaults to location.origin if undefined and client = referer.\n // This is required when client has been set as referer.\n // Example : referer=https://myserver/mywebapp\n referer?: string;\n\n // The token expiration time in minutes. The default is 60 minutes (one hour).\n // The maximum expiration period is 15 days. The maximum value of the expiration time is controlled by the server.\n // Requests for tokens larger than this time will be rejected.\n // Applications are responsible for renewing expired tokens;\n // expired tokens will be rejected by the server on subsequent requests that use the token.\n expiration?: number; // in minutes, defaults to 60 minutes\n}\n\n/** @internal */\nexport class ArcGisTokenGenerator {\n private static readonly restApiPath = \"/rest/\";\n private static readonly restApiInfoPath = \"info?f=pjson\";\n\n // Cache info url to avoid fetching/parsing twice for the same base url.\n private static _tokenServiceUrlCache = new Map<string, string>();\n\n public static async fetchTokenServiceUrl(arcGisRestServiceUrl: string): Promise<string | undefined> {\n const lowerUrl = arcGisRestServiceUrl.toLowerCase();\n const restApiIdx = lowerUrl.indexOf(ArcGisTokenGenerator.restApiPath);\n if (restApiIdx === -1)\n return undefined;\n const infoUrl = arcGisRestServiceUrl.substring(0, restApiIdx + ArcGisTokenGenerator.restApiPath.length) + ArcGisTokenGenerator.restApiInfoPath;\n\n let tokenServicesUrl: string | undefined;\n try {\n const response = await fetch(infoUrl, { method: \"GET\" });\n const json = await response.json();\n tokenServicesUrl = ArcGisTokenGenerator.getTokenServiceFromInfoJson(json);\n } catch { }\n return tokenServicesUrl;\n }\n\n public static getTokenServiceFromInfoJson(json: any): string | undefined {\n return json.authInfo?.isTokenBasedSecurity ? json?.authInfo?.tokenServicesUrl : undefined;\n }\n\n public async getTokenServiceUrl(baseUrl: string): Promise<string | undefined> {\n const cached = ArcGisTokenGenerator._tokenServiceUrlCache.get(baseUrl);\n if (cached !== undefined)\n return cached;\n\n const tokenServiceUrl = await ArcGisTokenGenerator.fetchTokenServiceUrl(baseUrl);\n if (tokenServiceUrl !== undefined)\n ArcGisTokenGenerator._tokenServiceUrlCache.set(baseUrl, tokenServiceUrl);\n\n return tokenServiceUrl;\n }\n\n // base url: ArcGis REST service base URL (format must be \"https://<host>/<instance>/rest/\")\n public async generate(arcGisRestServiceUrl: string, userName: string, password: string, options: ArcGisGenerateTokenOptions): Promise<any> {\n const tokenServiceUrl = await this.getTokenServiceUrl(arcGisRestServiceUrl);\n if (!tokenServiceUrl)\n return undefined;\n\n let token: undefined;\n try {\n const encodedUsername = encodeURIComponent(userName);\n const encodedPassword = encodeURIComponent(password);\n\n // Compose the expiration param\n let expirationStr = \"\";\n if (options.expiration) {\n expirationStr = `&expiration=${options.expiration}`;\n }\n\n // Compose the client param\n let clientStr = \"\";\n if (options.client === ArcGisTokenClientType.referer) {\n let refererStr = \"\";\n if (options.referer === undefined) {\n refererStr = encodeURIComponent(location.origin); // default to application origin\n } else {\n refererStr = encodeURIComponent(options.referer);\n }\n\n clientStr = `&client=referer&referer=${refererStr}`;\n } else if (options.client === ArcGisTokenClientType.ip) {\n if (options.ip === undefined)\n return token;\n clientStr = `&client=ip&ip=${options.ip}`;\n } else if (options.client === ArcGisTokenClientType.requestIp) {\n clientStr = `&client=requestip&ip=`;\n }\n\n const httpRequestOptions: RequestInit = {\n method: \"POST\",\n body: `username=${encodedUsername}&password=${encodedPassword}${clientStr}${expirationStr}&f=pjson`,\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n };\n\n const response = await fetch(tokenServiceUrl, httpRequestOptions);\n\n // Check a token was really generated (an error could be part of the body)\n token = await response.json();\n\n } catch { }\n return token;\n }\n\n // Encode following 'application/x-www-form-urlencoded' standard (https://www.w3.org/TR/html401/interact/forms.html#h-17.13.3.3)\n // Also mentioned here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n public static formEncode(str: string): string {\n return ArcGisTokenGenerator.rfc1738Encode(str).replace(/%20/g, \"+\");\n }\n\n // Encode following RFC1738 standard (https://www.ietf.org/rfc/rfc1738.txt)\n // Code from https://locutus.io/php/url/rawurlencode/\n public static rfc1738Encode(str: string): string {\n return encodeURIComponent(str)\n .replace(/!/g, \"%21\")\n .replace(/'/g, \"%27\")\n .replace(/\\(/g, \"%28\")\n .replace(/\\)/g, \"%29\")\n .replace(/\\*/g, \"%2A\");\n }\n}\n"]}
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
import { ArcGisTokenGenerator } from "./ArcGisTokenGenerator";
|
|
9
9
|
/** @internal */
|
|
10
10
|
export class ArcGisTokenManager {
|
|
11
|
+
static { this.tokenExpiryThreshold = 300000; } // 5 minutes in milliseconds
|
|
12
|
+
static { this._cache = new Map(); }
|
|
13
|
+
static { this._browserStorageKey = "arcGisOAuth"; }
|
|
11
14
|
static async getToken(arcGisRestServiceUrl, userName, password, options) {
|
|
12
15
|
if (!ArcGisTokenManager._generator)
|
|
13
16
|
ArcGisTokenManager._generator = new ArcGisTokenGenerator();
|
|
@@ -102,7 +105,4 @@ export class ArcGisTokenManager {
|
|
|
102
105
|
window.localStorage.setItem(this._browserStorageKey, JSON.stringify(storageTokens));
|
|
103
106
|
}
|
|
104
107
|
}
|
|
105
|
-
ArcGisTokenManager.tokenExpiryThreshold = 300000; // 5 minutes in milliseconds
|
|
106
|
-
ArcGisTokenManager._cache = new Map();
|
|
107
|
-
ArcGisTokenManager._browserStorageKey = "arcGisOAuth";
|
|
108
108
|
//# sourceMappingURL=ArcGisTokenManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArcGisTokenManager.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenManager.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAGH,OAAO,EAA8D,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAO1H,gBAAgB;AAChB,MAAM,OAAO,kBAAkB;
|
|
1
|
+
{"version":3,"file":"ArcGisTokenManager.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Tiles\n */\n\nimport { MapLayerAccessToken } from \"@itwin/core-frontend\";\nimport { ArcGisGenerateTokenOptions, ArcGisOAuth2Token, ArcGisToken, ArcGisTokenGenerator } from \"./ArcGisTokenGenerator\";\n\n/** @internal */\ninterface ArcGisTokenProps {\n [hostname: string]: ArcGisOAuth2Token;\n}\n\n/** @internal */\nexport class ArcGisTokenManager {\n private static readonly tokenExpiryThreshold = 300000; // 5 minutes in milliseconds\n private static _cache = new Map<string, ArcGisToken>();\n private static _oauth2Cache: Map<string, ArcGisOAuth2Token> | undefined;\n private static _generator: ArcGisTokenGenerator | undefined;\n private static readonly _browserStorageKey = \"arcGisOAuth\";\n\n public static async getToken(arcGisRestServiceUrl: string, userName: string, password: string, options: ArcGisGenerateTokenOptions): Promise<ArcGisToken | undefined> {\n if (!ArcGisTokenManager._generator)\n ArcGisTokenManager._generator = new ArcGisTokenGenerator();\n\n const tokenCacheKey = `${encodeURIComponent(userName)}@${arcGisRestServiceUrl}`;\n\n // First check in the session cache\n const cachedToken = ArcGisTokenManager._cache.get(tokenCacheKey);\n\n // Check if token is in cached and is valid within the threshold, if not, generate a new token immediately.\n if (cachedToken !== undefined && (cachedToken.expires - (+new Date()) > ArcGisTokenManager.tokenExpiryThreshold)) {\n return cachedToken;\n }\n\n // Nothing in cache, generate a new token\n const newToken = await ArcGisTokenManager._generator.generate(arcGisRestServiceUrl, userName, password, options);\n if (newToken.token) {\n const token = newToken as ArcGisToken;\n ArcGisTokenManager._cache.set(tokenCacheKey, token);\n return token;\n }\n\n return undefined;\n }\n\n public static invalidateToken(token: MapLayerAccessToken): boolean {\n\n for (const [key, value] of ArcGisTokenManager._cache) {\n if (value.token === token.token)\n return ArcGisTokenManager._cache.delete(key);\n }\n\n return false;\n }\n\n public static getOAuth2Token(key: string): ArcGisOAuth2Token | undefined {\n if (ArcGisTokenManager._oauth2Cache === undefined) {\n ArcGisTokenManager._oauth2Cache = new Map<string, ArcGisOAuth2Token>();\n ArcGisTokenManager.loadFromBrowserStorage();\n }\n\n const cachedToken = ArcGisTokenManager._oauth2Cache.get(key);\n\n // If cached token has expired (or about to expire), invalidate don't return it.\n if (cachedToken !== undefined && (cachedToken.expiresAt - (+new Date()) < ArcGisTokenManager.tokenExpiryThreshold)) {\n ArcGisTokenManager._oauth2Cache.delete(key);\n return undefined;\n }\n\n return cachedToken;\n }\n\n public static invalidateOAuth2Token(token: MapLayerAccessToken) {\n\n if (ArcGisTokenManager._oauth2Cache) {\n for (const [key, value] of ArcGisTokenManager._oauth2Cache) {\n if (value.token === token.token){\n const deleted = ArcGisTokenManager._oauth2Cache.delete(key);\n ArcGisTokenManager.saveToBrowserStorage();\n return deleted;\n }\n }\n }\n\n return false;\n }\n\n public static setOAuth2Token(key: string, token: ArcGisOAuth2Token) {\n\n if (ArcGisTokenManager._oauth2Cache === undefined) {\n ArcGisTokenManager._oauth2Cache = new Map<string, ArcGisOAuth2Token>();\n\n }\n ArcGisTokenManager._oauth2Cache.set(key, token);\n\n ArcGisTokenManager.saveToBrowserStorage();\n }\n\n public static loadFromBrowserStorage() {\n if (ArcGisTokenManager._oauth2Cache === undefined) {\n return;\n }\n\n const loadEntries = (json: string | undefined) => {\n if (json && ArcGisTokenManager._oauth2Cache !== undefined) {\n const tokens: ArcGisTokenProps | undefined = JSON.parse(json);\n if (tokens) {\n for (const [key, value] of Object.entries(tokens)) {\n ArcGisTokenManager._oauth2Cache.set(key, value);\n }\n }\n }\n };\n\n loadEntries(window.sessionStorage.getItem(this._browserStorageKey) ?? undefined);\n loadEntries(window.localStorage.getItem(this._browserStorageKey) ?? undefined);\n }\n\n public static saveToBrowserStorage() {\n\n if (ArcGisTokenManager._oauth2Cache === undefined) {\n return;\n }\n const sessionTokens: ArcGisTokenProps = {};\n const storageTokens: ArcGisTokenProps = {};\n\n ArcGisTokenManager._oauth2Cache.forEach((value: ArcGisOAuth2Token, key: string) => {\n // ignore the persist flag for now, and only save to session storage\n // if (value.persist === true) {\n // storageTokens[key] = value;\n // } else {\n // sessionTokens[key] = value;\n // }\n sessionTokens[key] = value;\n });\n window.sessionStorage.setItem(this._browserStorageKey, JSON.stringify(sessionTokens));\n window.localStorage.setItem(this._browserStorageKey, JSON.stringify(storageTokens));\n }\n\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/map-layers-auth",
|
|
3
|
-
"version": "5.0.0-dev.
|
|
3
|
+
"version": "5.0.0-dev.40",
|
|
4
4
|
"description": "Extension that adds a Map Layers Widget",
|
|
5
5
|
"main": "lib/cjs/map-layers-auth.js",
|
|
6
6
|
"module": "lib/esm/map-layers-auth.js",
|
|
@@ -40,13 +40,13 @@
|
|
|
40
40
|
"source-map-support": "^0.5.6",
|
|
41
41
|
"typescript": "~5.6.2",
|
|
42
42
|
"fetch-mock": "~11.1.3",
|
|
43
|
-
"@itwin/build-tools": "5.0.0-dev.
|
|
44
|
-
"@itwin/core-bentley": "5.0.0-dev.
|
|
45
|
-
"@itwin/core-common": "5.0.0-dev.
|
|
46
|
-
"@itwin/core-frontend": "5.0.0-dev.
|
|
43
|
+
"@itwin/build-tools": "5.0.0-dev.40",
|
|
44
|
+
"@itwin/core-bentley": "5.0.0-dev.40",
|
|
45
|
+
"@itwin/core-common": "5.0.0-dev.40",
|
|
46
|
+
"@itwin/core-frontend": "5.0.0-dev.40"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
|
-
"@itwin/core-bentley": "5.0.0-dev.
|
|
49
|
+
"@itwin/core-bentley": "5.0.0-dev.40"
|
|
50
50
|
},
|
|
51
51
|
"nyc": {
|
|
52
52
|
"extends": "./node_modules/@itwin/build-tools/.nycrc",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"scripts": {
|
|
76
76
|
"build": "npm run -s build:cjs && npm run -s build:esm",
|
|
77
77
|
"build:cjs": "tsc 1>&2 --outDir lib/cjs",
|
|
78
|
-
"build:esm": "tsc 1>&2 --module
|
|
78
|
+
"build:esm": "tsc 1>&2 --module ES2022 --outDir lib/esm",
|
|
79
79
|
"clean": "rimraf lib .rush/temp/package-deps*.json",
|
|
80
80
|
"cover": "nyc npm -s test",
|
|
81
81
|
"docs": "",
|