0

我在我的 arcgis 在线门户上创建了一个 Web 场景并将其托管在那里。现在我想通过 arcgis javascript api v4.1.6 在地图上加载 webscene,并且我想通过代码传递凭证(就像我可以从 argis js api 获得的具有正确客户端 ID 和客户端密码的令牌)。

这是我加载网络场景的代码

let scene = new WebScene({
  portalItem: { // autocasts as new PortalItem()
    id: "0614ea1f9dd043e9ba157b9c20d3c538"  // ID of the WebScene on the on-premise portal
  }
});`

let myHeaders = new Headers();
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");

var formdata = new FormData();
formdata.append("client_id", "");
formdata.append("client_secret", "");
formdata.append("grant_type", "client_credentials");
formdata.append("expiration", "20160");

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: formdata,
  redirect: 'follow'
};

let token = await fetch("https://www.arcgis.com/sharing/rest/oauth2/token", requestOptions)

当我想在我的网站上查看地图时,它总是提示一个弹出窗口并询问用户名和密码。所以我很好奇当我加载网络场景时是否可以在代码中的某处提供令牌?所以它不会向用户询问用户名和密码。

您能否提供一些 ArcGIS API JavaScript v4.1.6 中的示例代码?

谢谢!

4

2 回答 2

1

可以使用 Esri 资源代理绕过登录提示。但是,自述文件确实说“不允许将凭据嵌入资源代理中以绕过命名用户身份验证(即每个最终用户必须拥有自己唯一登录名的原则)”。

这是另一个可能的工作流程:

在 registerToken() 中传递在https://www.arcgis.com/sharing/rest/oauth2/token生成的令牌以访问非公共项目。这样,当访问存储在 ArcGIS Online 中的 web 地图和其他项目或服务器上的资源时,应用程序发出的每个 AJAX 请求都会转发此令牌。

        var url = "https://www.arcgis.com/sharing/rest/oauth2/token";
        var token = "";
        esriRequest(url, {
                query: {
                    client_id: "<CLIENT_ID>",
                    client_secret: "<CLIENT SECRET>",
                    grant_type: "client_credentials"
                },
                method: "post"
            })
            .then((response) => {
                token = response.data.access_token;
                esriId.registerToken({
                    server: "https://www.arcgis.com/sharing/rest",
                    token: token
                })
            })
            .catch((err) => {
                if (err.name === 'AbortError') {
                    console.log('Request aborted');
                } else {
                    console.error('Error encountered', err);
                }
            });

关于此工作流程需要注意的几点:

  1. 非公开项目必须由生成客户端 ID 和密码的同一用户拥有。
  2. web 地图/场景上的图层必须是公共的或由生成客户端 ID 和机密的用户拥有。也就是说,如果您确实需要包含由其他用户创建的非公共图层,您可以使用以下工作流程创建一个引用该图层的项目,然后将此新项目添加到 web 地图/场景 -

相关文档:

于 2020-10-14T13:04:56.250 回答
0

如果您想公开,这就是我的理解,您可以设置处理服务安全性的代理。ESRI 有类似任务的开放资源,看看这个,

ESRI Git - 资源 - 代理

于 2020-09-25T22:57:51.153 回答