如何使用 Python 和/或 Javascript 自动验证 ngrok 密码?
Posted
技术标签:
【中文标题】如何使用 Python 和/或 Javascript 自动验证 ngrok 密码?【英文标题】:How to authenticate ngrok password automatically using Python and or Javascript? 【发布时间】:2021-06-11 16:05:35 【问题描述】:我正在使用 ngrok 在树莓派上公开我的本地主机,并且 ngrok 受密码保护。我在网络外的另一台计算机上使用 Django 来访问这个树莓派上的网页(简单服务器)。我不想手动输入 ngrok 的用户名和密码。
如何自动填写 ngrok 用户/密码,这是 chrome 中要求输入用户和密码的弹出窗口?
我尝试过的:
我第一次尝试在我的模板中使用 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'
【问题讨论】:
也许这会对你有所帮助***.com/questions/47506092/… 【参考方案1】:ngrok 使用的身份验证方法称为 HTTP Basic Auth。要将其与 requests 库一起使用,您需要在 auth
参数中将登录名和密码作为元组传递:
r = client.post(loginURL, auth=(UN, PWD))
文档:Basic Authentication — Requests
【讨论】:
谢谢@Igonato。你在哪里找到的,或者你怎么知道 ngrok 使用了这种类型的身份验证? @MattGWww-Authenticate
标头指定了用于获取资源访问权限的身份验证方法,其中包含基本权限。此外,当您看到本机浏览器弹出窗口时,它是基本身份验证。并在像 user:pass@example.com 这样的 URL 中传递凭据 - 这也仅适用于基本身份验证【参考方案2】:
先尝试登录页面。也许它正在设置一些它希望出现在帖子上的 cookie:
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)
【讨论】:
【参考方案3】:您需要区分是从浏览器还是从服务器应用程序发出请求。
浏览器
如果您在浏览器中执行此操作,则会遇到 CORS 问题,而 ngrok 在提供 --auth
时不支持该问题。来自docs:
你不能使用 ngrok 的 -auth 选项。 ngrok 的 http 隧道允许您指定基本身份验证凭据来保护您的隧道。但是,ngrok 对 所有 请求强制执行此策略,包括 CORS 规范要求的预检 OPTIONS 请求。在这种情况下,您的应用程序必须实现自己的基本身份验证
在这种情况下,您唯一的选择是在您的应用程序中实现身份验证,而不是使用 ngrok 的 --auth
。
服务器
如果您从服务器应用程序发送请求,您不会遇到任何 CORS 问题,但您需要正确提供基本身份验证凭据。
假设您通过 http://myapp.ngrok.io
的 ngrok 公开了您的应用程序,并通过 --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 中你可以做类似的事情,this question 可能会让你走上正确的道路。
【讨论】:
以上是关于如何使用 Python 和/或 Javascript 自动验证 ngrok 密码?的主要内容,如果未能解决你的问题,请参考以下文章