如何通过esri js中的javascript api访问安全webscene(无需用户询问凭据)

如何通过esri js中的javascript api访问安全webscene(无需用户询问凭据),javascript,arcgis,arcgis-js-api,esri-maps,Javascript,Arcgis,Arcgis Js Api,Esri Maps,我在我的arcgis在线门户上创建了一个web场景,并将其托管在那里。现在,我想通过arcgis javascript api v4.1.6加载地图上的webscene,并且我想通过代码传递凭证(就像我可以使用正确的客户端id和客户端密码从argis js api获得的令牌) 下面是我加载web场景的代码 let scene = new WebScene({ portalItem: { // autocasts as new PortalItem() id: "0614ea

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

下面是我加载web场景的代码

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资源代理绕过登录提示。但是,自述文件确实指出,“不允许为了绕过命名用户身份验证(即每个最终用户必须有自己的唯一登录名的原则)而在资源代理中嵌入凭据”

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

在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);
                }
            });
var url=”https://www.arcgis.com/sharing/rest/oauth2/token";
var token=“”;
esriRequest(url{
查询:{
客户端id:“”,
客户_机密:“,
授予类型:“客户端凭据”
},
方法:“员额”
})
。然后((响应)=>{
令牌=response.data.access\u令牌;
esriId.registerToken({
服务器:“https://www.arcgis.com/sharing/rest",
令牌:令牌
})
})
.catch((错误)=>{
如果(err.name=='abortorror'){
log(“请求中止”);
}否则{
console.error(“遇到错误”,err);
}
});
关于此工作流,需要注意以下几点:

  • 非公共项目必须由生成客户端id和密码的同一用户拥有
  • web地图/场景上的层必须是公共的,或者由生成客户端id和机密的用户拥有。也就是说,如果确实需要包含由其他用户创建的非公共图层,则可以使用以下工作流创建引用该图层的项目,然后将此新项目添加到web地图/场景中-
    • 从web添加项目:
    相关文件:

    • IdentityManager.registerToken:
    • request.esriquest:

    代理文件似乎只适用于DotNet、Java和php,您想使用哪种语言?太棒了,很高兴您能理解!谢谢你的回复,我会试试看。只有一个关于加载web场景或web地图的问题。你是怎么装的?就在esriRequest()代码之后?能否提供使用esriRequest()加载web场景的示例代码?谢谢@当然!是的,我们可以在esriRequest()代码之后立即加载web场景或贴图。这是一本书。这不会在运行中起作用,因为我没有在代码中包含我的客户id或密码。很好!我已经测试了我的安全网络地图,效果非常好!谢谢