如何使用Python和/或Javascript自动验证ngrok密码?

如何使用Python和/或Javascript自动验证ngrok密码?,javascript,python,django,ngrok,Javascript,Python,Django,Ngrok,我使用ngrok在raspberry pi上公开我的本地主机,ngrok受密码保护。我正在网络之外的另一台计算机上使用Django访问此raspberry pi上的网页(简单服务器)。我不想手动输入ngrok的用户名和密码 如何自动填写ngrok用户/密码,这是chrome中的一个弹出窗口,询问用户和密码 我所尝试的: 我第一次尝试在模板中使用JS,只是使用了一个获取请求: https://user:password@myngrokdomain.ngrok.io但是chrome在控制台中抛出了一

我使用ngrok在raspberry pi上公开我的本地主机,ngrok受密码保护。我正在网络之外的另一台计算机上使用Django访问此raspberry pi上的网页(简单服务器)。我不想手动输入ngrok的用户名和密码

如何自动填写ngrok用户/密码,这是chrome中的一个弹出窗口,询问用户和密码

我所尝试的: 我第一次尝试在模板中使用JS,只是使用了一个获取请求:
https://user:password@myngrokdomain.ngrok.io
但是chrome在控制台中抛出了一个错误,说我不能像这样以纯文本形式传递凭据,所以

然后我尝试使用python请求:

    UN= "myuser"
    PWD = "mypassword"
    loginURL = "https://myngrokdomain.ngrok.io"
    client = requests.session()
    login_data = dict(username=UN, password=PWD,)
    r = client.post(loginURL, data=login_data)
这返回了401访问被拒绝的消息

r.headers+r.reason
返回:
401未经授权的未授权{'Content-Length':'16','Content-Type':'text/plain','Www-Authenticate':'Basic realm=“ngrok”,'Date':'Tue,2021年3月16日15:22:15 GMT'}

尝试先在登录页面上执行get。也许它正在设置一些cookies,希望它们出现在帖子上:

    UN= "myuser"
    PWD = "mypassword"
    loginURL = "https://myngrokdomain.ngrok.io"
    client = requests.session()
    login_data = dict(username=UN, password=PWD,)
    client.get(loginURL )
    r = client.post(loginURL, data=login_data)

ngrok使用的身份验证方法称为HTTP Basic Auth。要将其用于请求库,请在
auth
参数中将login和password作为元组传递:

r = client.post(loginURL, auth=(UN, PWD))

文档:

您需要区分是从浏览器还是从服务器应用程序发出请求

浏览器 如果您是从浏览器执行此操作,那么您遇到了CORS问题,而ngrok在提供
--auth
时不支持此问题。从:

不能使用ngrok的-auth选项。ngrok的http隧道允许您指定基本身份验证凭据以保护您的隧道。但是,ngrok对所有请求强制执行此策略,包括CORS规范要求的飞行前选项请求。在这种情况下,您的应用程序必须实现自己的基本身份验证

在这种情况下,您唯一的选择是在应用程序中实现身份验证,而不是使用ngrok的
--auth

服务器 如果您从服务器应用程序发送请求,则不会遇到任何CORS问题,但需要正确提供基本身份验证凭据

假设您通过ngrok在
http://myapp.ngrok.io
通过
--身份验证用户:通过
保护

在plain Node.js中,您可以执行以下操作:

consthttp=require('http'))
http.get('http://myapp.ngrok.io“,{auth:'user:pass'},res=>{
常量块=[]
res.on('data',chunk=>{
chunk.push(chunk)
})
res.on('结束',()=>{
console.log(Buffer.concat(chunks.toString('utf-8'))
})
})
请注意,要点击https url,您将使用节点的
https
模块,而不是
http
,或者使用更高级别的库来为您处理,如


在Python中,您可以执行类似的操作,可能会让您走上正确的道路。

这可能会帮助您,谢谢@Igonato。您在哪里发现或如何知道ngrok使用了这种身份验证?@MattG
Www-Authenticate
标题指定了访问资源时应使用的身份验证方法,其中显示了基本权限。此外,当您看到本机浏览器弹出窗口时,它是基本身份验证。并在URL中传递凭据,如用户:pass@example.com-这也仅适用于基本身份验证