我正在托管一个简单的网站,它只不过是在单击按钮时调用API。 API im calling (Home assistant)要求密码包含在标题中。在测试时可以正常工作,但是我如何以安全的方式做到这一点?
我对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服务器)
在没有.js文件的情况下调用API和提供密码的正确方法是什么?
答案 0 :(得分:0)
首先,您想通过Nginx路由所有内容并禁用对Pi的公共访问。绑定Pi的网络接口以仅侦听本地网络上的请求和防火墙外部请求,以阻止除80(如果您具有SSL,则为443)以外的所有端口。
在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将向https://exampledomain.org/switch的请求代理到您的Pi,其中添加了密码标头,并在X-Real-IP标头中添加了原始客户端IP