【问题标题】:Flask not using curl auth烧瓶不使用 curl 身份验证
【发布时间】:2015-10-21 12:45:49
【问题描述】:

我正在运行一个 Flask 应用程序,使用带有 mod_wsgi 的 apache,使用我自己的 ssl 证书(自签名),我还使用 Flask-HTTPAuth 库(https://flask-httpauth.readthedocs.org/en/latest/)并且我确实使用 BasicAuth

app.auth = HTTPBasicAuth()

我正在尝试使用 curl 测试 api,但我的烧瓶应用程序没有登录。

这是卷曲线

/usr/bin/curl -H 'Accept: application/json' -H 'Content-type: application/json' -u 'user:mypasswd' --cacert path_to/rootCA.crt --key path_to/backend.key --cert path_to/backend.crt -X POST -d '{}' -vvv https://my_url:443/api/1.0/code/create

有来自服务器的答案

* Hostname was NOT found in DNS cache
*   Trying ** ...
* Connected to ** (**) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: path_to/rootCA.crt
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
*    subject: ***
*    start date: 2015-10-20 13:22:20 GMT
*    expire date: 2017-03-03 13:22:20 GMT
*    common name: *** (matched)
*    issuer: ***
*    SSL certificate verify ok.
* Server auth using Basic with user 'user'
> POST //api/1.0/code/create HTTP/1.1
> Authorization: Basic amFtZXM6TDMgbDFuZCEgQHYgczBsMyFM
> User-Agent: curl/7.35.0
> Host: ***
> Accept: application/json
> Content-type: application/json
> Content-Length: 83
>
* upload completely sent off: 83 out of 83 bytes
< HTTP/1.1 401 UNAUTHORIZED
< Date: Wed, 21 Oct 2015 12:29:17 GMT
* Server Apache/2.4.7 (Ubuntu) is not blacklisted
< Server: Apache/2.4.7 (Ubuntu)
* Authentication problem. Ignoring this.
< WWW-Authenticate: Basic realm="Authentication Required"
< Content-Length: 19
< Content-Type: text/html; charset=utf-8
<
* Connection #0 to host ***m left intact
Unauthorized Access

有一个由 -u 选项创建的授权标头。但是在我的烧瓶应用程序中没有给出用户名或密码。

@app.auth.verify_password
def verify_password(username, passwd):
  print "USername [%s] [%s]" % (username, passwd)
  return False

给出的输出是:

USername [] []

所以我的问题是如何使用 curl 为 verify_password 装饰器提供用户名和密码?

谢谢。

【问题讨论】:

  • 你在使用 Apache 和 mod_wsgi 吗?如果是这样,可能需要将其配置为将授权标头传递给您的烧瓶应用程序。见Deployment ConsiderationsWSGIPassAuthorization
  • 是的,我是(将把它添加到我的帖子中),谢谢你,我去看看。

标签: python authentication curl flask http-headers


【解决方案1】:

您需要配置 mod_wsgi 以将授权标头传递给您的烧瓶应用程序。

来自Flask-HTTPAuth docs

请注意,某些 Web 服务器不会传递 Authorization 标头 默认发送到 WSGI 应用程序。

另外,来自verify_password 的文档:

如果定义了这个回调,它也会在请求完成时被调用 没有带有用户凭据的 Authorization 标头,并且在此 如果用户名和密码参数都设置为空 字符串。

...这可以解释您看到的输出。

由于您将 Apache 与 mod_wsgi 一起使用,因此您应该在 Apache 配置中将 WSGIPassAuthorization directive 设置为 On(默认为 Off)。

【讨论】:

  • 当在 Apache 中部署为带有 ScriptAlias 的常规 CGI 脚本时,必须添加指令 CGIPassAuth On
【解决方案2】:

感谢@jeremy-allen 就是这样。

因此,如果这样的事情阻止了您(并且您正在使用 mod_wsgi)。

点击链接:https://flask-httpauth.readthedocs.org/en/latest/#deployment-considerationshttps://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIPassAuthorization

您可能错过了 apache 配置中的 WSGIPassAuthorization 变量。

谢谢。

【讨论】:

  • 您在之前将我的标记为答案之后将其标记为答案...在之前将其标记为答案之后。正确的做法是将我的答案标记为答案并删除此答案。
  • 实际上,在你的 cmets 之后,我找到了解决方案,所以我发布了我自己的答案,然后你发布了它,反射让我点击你的,但我的已经被接受了。在我点击了很多次之后才知道可能只有一个答案。正如你刚开始评论的那样,我认为我应该让我的回答被接受,但我真的不在乎,我不会为了声誉而奔波,如果你需要它我可以做到,但我只是让它这样。
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 2019-03-28
  • 2021-11-01
  • 2021-09-06
  • 2020-03-13
  • 2016-07-17
  • 1970-01-01
  • 2021-03-24
相关资源
最近更新 更多