我正在使用与我的服务器上的REST API通信的android应用程序,该应用程序是自签名的。我的API使用框架回送在节点上运行。
现在,我的API不安全,因此我可以从android应用发送请求,并且效果很好。只有我的域受保护。 API在端口3000上运行。现在,问题来了。
我已经创建了一个用于重置密码的网络表单,因此当用户在应用程序中并想要重置其帐户的密码时,他会收到电子邮件。他可以在应用程序或浏览器中打开带有重置链接的电子邮件。
1。情况
当用户在浏览器中打开重置链接时,他在HTTPS URL上。当他输入新密码并点击按钮更改密码时,他正在从HTTPS向HTTP上的不安全API发送请求。
这给了我错误:
The page at xxx was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint xxx. This request has been blocked; the content must be served over HTTPS.
这是我的功能:
function post() {
const urlParams = new URLSearchParams(window.location.search);
const token = urlParams.get('access_token');
console.log("TOKEN:", token);
const user = {
newPassword: document.querySelector('#input-password-check').value,
}
const http = new XMLHttpRequest()
http.open('POST', 'http://www.example.com:3000/api_path/reset-password')
http.setRequestHeader('x-access-token', token)
http.send(JSON.stringify(user))
http.onload = function() {
alert(http.responseText)
}
}
2。情况
当我保护我的API时,我的域和API均为HTTPS,我可以从Web重置密码,但是当我发送请求时,我得到ERR_CERT_AUTHORITY_INVALID
。而且还来自android APP,因为它不信任我的证书。而且我找不到解决方案,如何使我的应用程序信任它。
我还应该说我是从url解析令牌,并且在应用程序中重置密码时,该令牌在标头中发送,并且我在Java中从我的应用程序发送请求...不打开网站。一切都通过retrofix + rxjava完成。
任何想法如何解决这个问题?我不想绕开它,我想做正确的事,但也不想为受信任的SSL证书付费...
答案 0 :(得分:0)
我能够通过使用Lets Encrypt证书解决此问题。以前,我已经在服务器上安装了Encrypt,但是我为Loopback API创建了新的自签名证书,这很愚蠢,我不知道自己在做什么。
因此,不要忘记将回送api的证书路径设置为“让我们加密”。