Я пытаюсь внедрить карту ArcGIS в существующее приложение JavaScript (Node.js / React) и начал видеть всплывающее окно входа в ArcGIS, появляющееся в моем приложении при попытке загрузить слои из ArcGIS Online.Поскольку не у всех моих пользователей будут учетные записи ArcGIS, я хочу включить вход в систему на основе приложений.
Из документации (которая, кажется, приводит меня в круги), похоже, мне нужно настроить свой сервер Nodejs с помощьюмой идентификатор клиента / секрет, чтобы он мог получать токены доступа и затем отправлять их клиенту, чтобы клиент в свою очередь имел доступ к ресурсам из ArcGIS Online.
Серверная часть этого кажется достаточно простой - просто сделайте запрос и получите верный токен.Но мне не ясно, что делать, когда мое клиентское приложение получает токен с моего сервера Nodejs.Поскольку мой код на стороне клиента написан с использованием React, я использую пакет @ esri / реагировать-arcgis npm для загрузки модулей ArcGIS.Я играл с модулем IdentityManager, но безуспешно.
Если у кого-то есть идеи по настройке входа в систему на основе приложения, я действительно ценю это.Вот мой код React на стороне клиента.
import React from 'react';
import {loadModules} from '@esri/react-arcgis';
const options = {url: 'https://js.arcgis.com/4.6/'};
const styles = {
container: {
height: '100%',
width: '100%'
},
mapDiv: {
padding: 0,
margin: 0,
height: '100%',
width: '100%'
},
}
export default class MapTab extends React.Component {
constructor(props) {
super(props);
this.state = {
status: 'loading'
}
loadModules(['esri/Map', 'esri/views/MapView', 'esri/layers/MapImageLayer'], options)
.then(([Map, MapView, MapImageLayer]) => {
// how do I implement app based login here once I have the access token?
var layer3 = new MapImageLayer({
url: "https://livefeeds.arcgis.com/arcgis/rest/services/LiveFeeds/NWS_Watches_Warnings_and_Advisories/MapServer"
});
const map = new Map({
basemap: "hybrid",
layers: [layer3]
});
const view = new MapView({
container: "viewDiv",
map,
center: [this.props.latLng.lng, this.props.latLng.lat],
zoom: 5,
});
view.when(() => {
this.setState({
map,
view,
status: 'loaded'
});
});
})
}
renderMap() {
if(this.state.status === 'loading') {
return <h1>loading</h1>;
}
}
render() {
if(this.state.view){
this.state.view.goTo([this.props.latLng.lng, this.props.latLng.lat])
}
return(
<div id='parent' style={styles.container}>
<div id='viewDiv' style={ styles.mapDiv } >
{this.renderMap()}
</div>
</div>
)
}
}