Javascript 使用标头中的密码调用API的正确方法

Javascript 使用标头中的密码调用API的正确方法,javascript,jquery,ajax,api,https,Javascript,Jquery,Ajax,Api,Https,我主持了一个简单的网站,只不过是在点击按钮时调用API。要求在标头中包含密码。这在测试时可以很好地工作,但是如何以安全的方式进行呢 我对API的ajax调用目前的密码为明文,任何检查.js文件的人都可以查看 function ToggleAPI(){ $.ajax ({ type: "post", url: "https://exampledomain.org:8123/api/services/switch/toggle", data

我主持了一个简单的网站,只不过是在点击按钮时调用API。要求在标头中包含密码。这在测试时可以很好地工作,但是如何以安全的方式进行呢

我对API的ajax调用目前的密码为明文,任何检查.js文件的人都可以查看

    function ToggleAPI(){
    $.ajax
    ({
      type: "post",
      url: "https://exampledomain.org:8123/api/services/switch/toggle",
      dataType: 'json',
      headers: {
            'x-ha-access': 'MyPasswordThatCanBViewdByAnyone',
            'content-type': 'application/json'
        },
      async: false,
      contentTtpe: 'application/json',
      data: JSON.stringify( {
        "entity_id": "SomeId"
      }),
      success: function (data){
        console.log("Sucess",data);
      },
      error: function(err){
          console.log("Error",err);
      }
    });

}
API与承载站点的web服务器在同一台计算机上运行。 (设置为运行Home Assistant的raspberry pi和托管网站的NGINX服务器)


调用API和提供密码的正确方法是什么,而不在.js文件中?

首先,您希望通过Nginx路由所有内容并禁用对Pi的公共访问。绑定Pi的网络接口,以仅侦听本地网络上的请求,以及防火墙外部请求,以阻止除80(或443,如果您有SSL)之外的所有端口

在Nginx conf文件中的网站服务器块中,您现在可以设置一个位置,该位置将代理对Pi的请求。如果你想让它更令人难忘,URL不必与Pi上的URL匹配。大概是这样的:

location /switch{
proxy_pass http://pi.ip.address.here:8123/api/services/switch/toggle/;
proxy_set_header x-ha-access MyPasswordThatCanBViewdByAnyone;
proxy_set_header X-Real-IP $remote_addr;
}

重新启动Nginx,现在Nginx会将对的请求代理给您的Pi,在添加了密码头和X-Real-IP头中的原始客户端IP后,在这种情况下,您必须使用webApi网关。根据某些标准,此安全头应添加到网关端。您使用JWT:所以Nginx将ajax请求代理给Pi?也看看这个答案:所以情况是Home Assistant提供了一个我无法使用的API控制,只消耗。我认为令牌更可取,但我不知道如何在当前设置中实现它@miknik Nginx承载html和js文件,因此它向同样在pi上运行的Home Assistant实例提供请求。没有标准的基本授权头man。检查API链接检查编辑,您可以在Nginx中添加任何您喜欢的头谢谢!我想这个答案让我找到了正确的方向。我将阅读Nginx文档,看看如何添加标题。这个URL是由Nginx代理的,还是它实际上直接指向Pi<代码>https://exampledomain.org:8123/api/services/switch/toggle根据端口号判断,我猜是后者?没有设置代理,它实际上通过公共域直接指向PI。请注意,网站本身将受到密码保护。