如何使用 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 使用了这种类型的身份验证? @MattG Www-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 密码?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在页眉中添加javascrip引用(或完整脚本)

如何将rails数据放入javascrip数组中

JavaScrip File类拓展

JavaScrip要不要加分号";"

JavaScrip和Java一样吗?

Promise -------JavaScrip