Javascript 使用标头中的密码调用API的正确方法
我主持了一个简单的网站,只不过是在点击按钮时调用API。要求在标头中包含密码。这在测试时可以很好地工作,但是如何以安全的方式进行呢 我对API的ajax调用目前的密码为明文,任何检查.js文件的人都可以查看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
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。请注意,网站本身将受到密码保护。