我使用ngrok在raspberry pi上公开我的本地主机,ngrok是受密码保护的。我在网络外的另一台计算机上使用Django访问这个raspberry pi上的网页(简单服务器)。我不想手动输入用户名和密码给ngrok。
我如何自动填写ngrok用户/密码,这是一个弹出的铬询问用户和密码?
我尝试过的是:我第一次尝试在模板中使用JS,只使用一个fetch请求: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 Unauthorized Unauthorized {'Content-Length': '16', 'Content-Type': 'text/plain', 'Www-Authenticate': 'Basic realm="ngrok"', 'Date': 'Tue, 16 Mar 2021 15:22:15 GMT'}
发布于 2021-03-22 23:18:23
您需要区分是从浏览器还是从服务器应用程序发出请求。
浏览器
如果您是在浏览器中执行此操作,则会遇到CORS问题,而ngrok在提供--auth时不支持该问题。来自文档
您不能使用ngrok的-auth选项。ngrok的http隧道允许您指定基本身份验证凭据来保护您的隧道。但是,ngrok对所有请求强制执行此策略,包括CORS规范所要求的飞行前选项请求。在这种情况下,应用程序必须实现自己的基本身份验证。
在这种情况下,您唯一的选择是在应用程序中实现身份验证,而不是使用ngrok的--auth。
服务器
如果您从服务器应用程序发送请求,则不会遇到任何CORS问题,但需要正确提供基本身份验证凭据。
假设您的应用程序是通过ngrok在http://myapp.ngrok.io上通过--auth user:pass进行保护的。
在普通的Node.js中,您可以这样做:
const http = require('http')
http.get('http://myapp.ngrok.io', { auth: 'user:pass' }, res => {
const chunks = []
res.on('data', chunk => {
chunks.push(chunk)
})
res.on('end', () => {
console.log(Buffer.concat(chunks).toString('utf-8'))
})
})注意,要访问https url,您可以使用Node的https模块而不是http,或者使用更高级别的库来为您处理这个问题,比如node-fetch。
在Python中,您可以做类似的事情,这个问题可能会让您走上正确的道路。
https://stackoverflow.com/questions/66620221
复制相似问题