使用ArcGIS JavaScript API设置基于应用程序的登录

时间:2019-04-05 23:17:49

标签: javascript arcgis arcgis-js-api

我试图在现有的JavaScript应用程序(Node.js / React)中实现ArcGIS地图,并开始尝试从ArcGIS Online加载图层时开始在我的应用程序中看到一个ArcGIS登录弹出窗口。由于并非我所有的用户都拥有ArcGIS帐户,因此我想启用基于应用程序的登录。

从文档中看来(似乎将我带入了圈子),看来我需要使用客户端ID /密码设置Nodejs服务器,以便它可以获取访问令牌,然后将其发送给客户端,以便客户端又可以从ArcGIS Online访问资源。

其中的服务器端部分似乎很容易-只需发出请求并取回有效令牌即可。但是我不清楚客户端应用程序从Nodejs服务器获取令牌后该怎么办。由于我的客户端代码是使用React编写的,因此我使用@ esri / react-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>
          )
        }
      }

2 个答案:

答案 0 :(得分:0)

请遵循以下说明:https://developers.arcgis.com/javascript/latest/guide/access-services-with-oauth-2/

但简要总结:

  1. 转到https://developers.arcgis.com
  2. 使用您的ArcGIS Online帐户信息登录
  3. 转到“应用程序”并创建“新应用程序”:https://developers.arcgis.com/applications
  4. 请确保将重定向URI更新到应用程序所在的位置,然后记下“客户端ID”
  5. 在您的应用中,使用esri/identity/OAuthInfo将上一步中的appId放入代码中。

答案 1 :(得分:0)

我最终使用了此解决方案,其中的示例代码为示例。

esriId.registerToken({
        server: 'https://www.arcgis.com/sharing',
        token: 'access token here'
      });

以前,我一直在对特定服务器使用registerToken方法,仅当在其下注册令牌时才授予我对这些特定服务器的访问权限。使用“ https://www.arcgis.com/sharing”作为服务器值似乎可以让我访问我想同时使用的所有公共/高级资源。

尽管我在文档中找不到任何类似的示例,但它适用于我的用例。