我正在开发 Angular 5网络应用,这是关于参加在线考试并立即告知结果。在尝试测试之后,客户端将向服务器请求正确答案的列表,然后它将用户的答案与从firebase服务器收到的正确答案进行比较,这就是为什么我绑定(我猜是这样)来存储API的原因客户方。
我的问题是,在部署应用程序(uglifying,tree-shaking)之后,任何人(甚至是经过身份验证的用户)都可以访问我的网络应用程序中硬编码的API吗?如果是,那对他们来说会有多容易?
最后,如果在应用程序中存储API密钥不是一个好习惯。我该怎么做才能保护我的应用中使用的firebase API。
我没有任何托管服务器,我的应用程序将完全依赖firebase。
注意:我在网上找到了一些有关此主题的信息。其中大部分内容对我来说非常混乱,或者是关于AngularJS / Angular 4.x应用程序(带有个人后端)/ Android应用程序。
更新 当用户选择尝试测试时,使用http请求获取存储在服务器上的问题和选项:
//Component Code
testData: any;
fetchTest() {
this.obtainTest.getTest()
.subscribe(
(response: Response) => {
this.testData = response.json();
console.log(this.testData);
},
(error) => console.log(error)
)
}
//Code from http Service
getTest(){
console.log('Obtain Test Service is working...');
return this.http.get('https://myfyp-40291.firebaseio.com/tests/-L0f5r_-tHLMk45AU5zg.json')
}
在testData
个问题中,他们可能的答案存储在firebase服务器中,然后显示给用户。然后用户在完成后选择可能的正确答案。使用http请求请求在firebase服务器上单独存储在另一个json对象中的正确答案,并将用户的答案与那些正确的答案进行比较,以向他显示他的分数。
getKeys(){
return this.http.get('https://myfyp-40291.firebaseio.com/keys/-L0k_SQivBudFGcNjD-k.json');
}
现在这是我想要保护的API。我已阅读有关firebase规则的内容。对于这个密钥写入肯定会限制用户,但如果我阻止读取,那么他将如何能够最终获得正确的答案?如果我让他阅读然后有一个威胁他可以从代码访问api密钥,手动下载json对象并知道所有正确的答案并相应地尝试测试。
在这种情况下,请告诉我该怎么做才能解决这个问题?
//英语不是我的第一语言,对于错误和困惑感到抱歉。
答案 0 :(得分:0)
是的,查看其Web浏览器调试器中的“网络”选项卡将显示来自服务器的响应,包括所有正确答案。
您应该将用户响应发送到服务器,它将计算得分并将其返回而不返回所有答案。