如何在 esri js 中通过 javascript api 访问安全网络场景(无需向用户询问凭据。)

How to access secure webscene through javascript api in esri js(without ask credential from user.)

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

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

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)

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

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

谢谢!

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

ESRI Git - Resources - Proxy

可以使用 Esri 资源代理绕过登录提示。然而,README 确实说“不允许将凭据嵌入资源代理以绕过命名用户身份验证(即每个 end-user 必须有自己唯一的登录的原则)”。

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

将在 https://www.arcgis.com/sharing/rest/oauth2/token 处生成的令牌传递到 registerToken() 中以访问 non-public 项目。因此,在访问 Web 地图和存储在 ArcGIS Online 中的其他项目或服务器上的资源时,应用程序发出的每个 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. non-public 项必须由生成客户端 ID 和密码的同一用户拥有。
  2. Web 地图/场景上的图层必须是 public 或由生成客户端 ID 和密码的用户所有。也就是说,如果您确实需要包含另一个用户创建的 non-public 图层,您可以使用以下工作流程创建一个引用该图层的项目,然后将这个新项目添加到 web 地图/场景 -

相关文档: