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

2024-10-03 23:30:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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 Unauthorized Unauthorized {'Content-Length': '16', 'Content-Type': 'text/plain', 'Www-Authenticate': 'Basic realm="ngrok"', 'Date': 'Tue, 16 Mar 2021 15:22:15 GMT'}


Tags: 用户httpsioclient密码datapwdpi
3条回答

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

浏览者

如果你在浏览器上做这件事,你就遇到了CORS问题,而ngrok在提供 auth时不支持这一点。从docs开始:

you cannot use ngrok's -auth option. ngrok's http tunnels allow you to specify basic authentication credentials to protect your tunnels. However, ngrok enforces this policy on all requests, including the preflight OPTIONS requests that are required by the CORS spec. In this case, your application must implement its own basic authentication

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

服务器

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

假设您的应用程序通过ngrok公开在http://myapp.ngrok.io通过 auth user:pass保护

在plain 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,您将使用节点的https模块而不是http,或者使用一个更高级别的库来处理它,如^{}

在Python中,您可以做类似的事情,this question可能会让您走上正确的道路

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

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

文件:Basic Authentication — Requests

首先尝试在登录页面上执行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)

相关问题 更多 >