微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过esri js中的javascript API访问安全的Webscene无需向用户询问凭据

如何解决如何通过esri js中的javascript API访问安全的Webscene无需向用户询问凭据

我已经在我的arcgis在线门户上创建了一个Web场景并将其托管在此。现在,我想通过arcgis javascript api v4.1.6将webscene加载到地图上,并希望通过代码传递凭据(例如可以从带有正确的客户端ID和客户端密码的argis js api中获取的令牌)。

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

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)

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

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

谢谢!

解决方法

如果您要公开它(据我所知),则可以设置处理服务安全性的代理。 ESRI为类似任务提供了开放资源,请看一下,

ESRI Git - Resources - Proxy

,

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

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

将在https://www.arcgis.com/sharing/rest/oauth2/token处生成的令牌传递到registerToken()中以访问非公共项。这样,在访问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. 非公开项目必须由生成客户ID和机密的同一用户拥有。
  2. 网络地图/场景上的图层必须是公开的,也必须由生成客户端ID和密码的用户拥有。就是说,如果您确实需要包括另一个用户创建的非公共层,则可以使用以下工作流创建引用该层的项目,然后将该新项目添加到网络地图/场景-

相关文档:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。