Skip to content

Commit 041f96c

Browse files
committed
[service] OAuth refresh token flow in work
1 parent c38a342 commit 041f96c

File tree

4 files changed

+32
-50
lines changed

4 files changed

+32
-50
lines changed

plugins/arcgis/service/src/ArcGISIdentityManagerFactory.ts

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import { ArcGISIdentityManager, request } from "@esri/arcgis-rest-request"
22
import { ArcGISAuthConfig, AuthType, FeatureServiceConfig, OAuthAuthConfig, TokenAuthConfig, UsernamePasswordAuthConfig } from './ArcGISConfig'
3-
import { ObservationProcessor } from "./ObservationProcessor";
43

54
interface ArcGISIdentityManagerFactory {
6-
create(portal: string, server: string, config: ArcGISAuthConfig, processor?: ObservationProcessor): Promise<ArcGISIdentityManager>
5+
create(portal: string, server: string, config: ArcGISAuthConfig): Promise<ArcGISIdentityManager>
76
}
87

98
const OAuthIdentityManagerFactory: ArcGISIdentityManagerFactory = {
10-
async create(portal: string, server: string, auth: OAuthAuthConfig, processor: ObservationProcessor): Promise<ArcGISIdentityManager> {
9+
async create(portal: string, server: string, auth: OAuthAuthConfig): Promise<ArcGISIdentityManager> {
1110
console.debug('Client ID provided for authentication')
1211
const { clientId, authToken, authTokenExpires, refreshToken, refreshTokenExpires } = auth
1312

@@ -27,24 +26,27 @@ const OAuthIdentityManagerFactory: ArcGISIdentityManagerFactory = {
2726
httpMethod: 'GET'
2827
});
2928

29+
// TODO Factory should not handle config changes
3030
// Update authToken to new token
31-
const config = await processor.safeGetConfig();
32-
let service = config.featureServices.find(service => service.url === portal)?.auth as OAuthAuthConfig;
33-
const date = new Date();
34-
date.setSeconds(date.getSeconds() + response.expires_in || 0);
35-
service = {
36-
...service,
37-
authToken: response.access_token,
38-
authTokenExpires: date.getTime()
39-
}
31+
// const config = await processor.safeGetConfig();
32+
// let service = config.featureServices.find(service => service.url === portal)?.auth as OAuthAuthConfig;
33+
// const date = new Date();
34+
// date.setSeconds(date.getSeconds() + response.expires_in || 0);
35+
// service = {
36+
// ...service,
37+
// authToken: response.access_token,
38+
// authTokenExpires: date.getTime()
39+
// }
40+
// await processor.putConfig(config)
4041

41-
await processor.putConfig(config)
42-
return ArcGISIdentityManager.fromToken({
43-
clientId: clientId,
44-
token: response.access_token,
45-
tokenExpires: date,
46-
portal: portal
47-
});
42+
// return ArcGISIdentityManager.fromToken({
43+
// clientId: clientId,
44+
// token: response.access_token,
45+
// tokenExpires: date,
46+
// portal: portal
47+
// });
48+
49+
throw new Error('TODO Unsupported')
4850
} catch (error) {
4951
throw new Error('Error occurred when using refresh token')
5052
}
@@ -86,8 +88,7 @@ const authConfigMap: { [key: string]: ArcGISIdentityManagerFactory } = {
8688
}
8789

8890
export function getIdentityManager(
89-
config: FeatureServiceConfig,
90-
processor: ObservationProcessor
91+
config: FeatureServiceConfig
9192
): Promise<ArcGISIdentityManager> {
9293
const auth = config.auth
9394
const authType = config.auth?.type
@@ -98,7 +99,7 @@ export function getIdentityManager(
9899
if (!factory) {
99100
throw new Error(`No factory found for type ${authType}`)
100101
}
101-
return factory.create(getPortalUrl(config.url), getServerUrl(config.url), auth, processor)
102+
return factory.create(getPortalUrl(config.url), getServerUrl(config.url), auth)
102103
}
103104

104105

plugins/arcgis/service/src/FeatureServiceAdmin.ts

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { MageEvent, MageEventRepository } from '@ngageoint/mage.service/lib/enti
44
import { Layer, Field } from "./AddLayersRequest"
55
import { Form, FormField, FormFieldType, FormId } from '@ngageoint/mage.service/lib/entities/events/entities.events.forms'
66
import { ObservationsTransformer } from "./ObservationsTransformer"
7-
import { HttpClient } from './HttpClient'
87
import { LayerInfoResult, LayerField } from "./LayerInfoResult"
98
import FormData from 'form-data'
109
import { request } from '@esri/arcgis-rest-request'
@@ -433,8 +432,7 @@ export class FeatureServiceAdmin {
433432
*/
434433
private async create(service: FeatureServiceConfig, layer: Layer) {
435434

436-
const httpClient = this.httpClient(service)
437-
const identityManager = await getIdentityManager(service, httpClient)
435+
const identityManager = await getIdentityManager(service)
438436
const url = this.adminUrl(service) + 'addToDefinition'
439437

440438
this._console.info('ArcGIS feature service addToDefinition (create layer) url ' + url)
@@ -461,8 +459,7 @@ export class FeatureServiceAdmin {
461459

462460
const layer = { fields: fields} as Layer
463461

464-
const httpClient = this.httpClient(service)
465-
const identityManager = await getIdentityManager(service, httpClient)
462+
const identityManager = await getIdentityManager(service)
466463
const url = this.adminUrl(service) + featureLayer.layer.toString() + '/addToDefinition'
467464

468465
this._console.info('ArcGIS feature layer addToDefinition (add fields) url ' + url)
@@ -501,8 +498,7 @@ export class FeatureServiceAdmin {
501498
const layer = {} as Layer
502499
layer.fields = deleteFields
503500

504-
const httpClient = this.httpClient(service)
505-
const identityManager = await getIdentityManager(service, httpClient)
501+
const identityManager = await getIdentityManager(service)
506502
const url = this.adminUrl(service) + featureLayer.layer.toString() + '/deleteFromDefinition'
507503

508504
this._console.info('ArcGIS feature layer deleteFromDefinition (delete fields) url ' + url)
@@ -532,18 +528,4 @@ export class FeatureServiceAdmin {
532528
}
533529
return url
534530
}
535-
536-
/**
537-
* Get a HTTP Client with administration token
538-
* @param service feature service
539-
* @returns http client
540-
*/
541-
private httpClient(service: FeatureServiceConfig): HttpClient {
542-
let token = service.adminToken
543-
if (token == null) {
544-
token = service.auth?.type == 'token' ? service.auth.token : ""
545-
}
546-
return new HttpClient(console, token)
547-
}
548-
549531
}

plugins/arcgis/service/src/ObservationProcessor.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@ import { EventTransform } from './EventTransform';
1414
import { GeometryChangedHandler } from './GeometryChangedHandler';
1515
import { EventDeletionHandler } from './EventDeletionHandler';
1616
import { EventLayerProcessorOrganizer } from './EventLayerProcessorOrganizer';
17-
import { FeatureServiceConfig, FeatureLayerConfig, AuthType, OAuthAuthConfig } from "./ArcGISConfig"
17+
import { FeatureServiceConfig, FeatureLayerConfig, AuthType } from "./ArcGISConfig"
1818
import { PluginStateRepository } from '@ngageoint/mage.service/lib/plugins.api'
1919
import { FeatureServiceAdmin } from './FeatureServiceAdmin';
20-
import { HttpClient } from './HttpClient'
2120
import { getIdentityManager } from "./ArcGISIdentityManagerFactory"
2221
import { request } from '@esri/arcgis-rest-request';
2322

@@ -218,7 +217,7 @@ export class ObservationProcessor {
218217

219218
for (const serv of services) {
220219
try {
221-
const identityManager = await getIdentityManager(serv, new HttpClient(console))
220+
const identityManager = await getIdentityManager(serv)
222221
const response = await request(serv.url, {
223222
authentication: identityManager
224223
}) as FeatureServiceResult
@@ -292,7 +291,7 @@ export class ObservationProcessor {
292291

293292
if (layerId != null) {
294293
featureLayer.layer = layerId
295-
const identityManager = await getIdentityManager(featureServiceConfig, new HttpClient(console))
294+
const identityManager = await getIdentityManager(featureServiceConfig)
296295
const featureService = new FeatureService(console, featureServiceConfig, identityManager)
297296
const layerInfo = await featureService.queryLayerInfo(layerId);
298297
const url = `${featureServiceConfig.url}/${layerId}`;
@@ -320,7 +319,7 @@ export class ObservationProcessor {
320319
await admin.updateLayer(featureServiceConfig, featureLayer, layerInfo, this._eventRepo)
321320
}
322321
const info = new LayerInfo(url, events, layerInfo, featureLayer.token)
323-
const identityManager = await getIdentityManager(featureServiceConfig, new HttpClient(console))
322+
const identityManager = await getIdentityManager(featureServiceConfig)
324323
const layerProcessor = new FeatureLayerProcessor(info, config, identityManager,this._console);
325324
this._layerProcessors.push(layerProcessor);
326325
// clearTimeout(this._nextTimeout); // TODO why is this needed?

plugins/arcgis/service/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ const arcgisPluginHooks: InitPluginHook<typeof InjectedServices> = {
193193

194194
try {
195195
// Create the IdentityManager instance to validate credentials
196-
await getIdentityManager(service!, processor)
196+
await getIdentityManager(service)
197197
let existingService = config.featureServices.find(service => service.url === url)
198198
if (existingService) {
199199
existingService = { ...existingService }
@@ -216,7 +216,7 @@ const arcgisPluginHooks: InitPluginHook<typeof InjectedServices> = {
216216
}
217217

218218
try {
219-
const identityManager = await getIdentityManager(featureService, processor)
219+
const identityManager = await getIdentityManager(featureService)
220220
const response = await request(url, {
221221
authentication: identityManager
222222
})

0 commit comments

Comments
 (0)