如何在Flask中访问Apache Basic Authentication用户

Ban*_*ong 10 apache flask

我正在Apache服务器上使用Flask开发一个网页,其中服务器正在执行基本身份验证.也就是说,访问服务器上的页面的用户通过Apache呈现登录屏幕,并且在将请求传递到我的页面之前检查登录凭证.

问题是我是否以及如何从我的flask/python代码访问用户名.当在同一台服务器上使用PHP而不是flask/python时,它很简单:用户名可用作$ _SERVER变量(可用两次,作为键PHP_AUTH_USER的值,也是AUTHENTICATE_CN).我猜/希望Apache会同样使得经过验证的用户名可用于烧瓶(可能通过WSGI以某种方式),但我找不到它.

我已经尝试在request.headers中显示所有键/值对,但用户名不存在.我还应该看看其他地方吗?

Mic*_*oka 16

您可以从request对象中找到Flask中的身份验证信息.

from flask import request

def my_view():
    auth = request.authentication
    username = auth.username
    password = auth.password
    ...
Run Code Online (Sandbox Code Playgroud)

但请注意,如果您使用的是apache mod_wsgi,则需要WSGIPassAuthorization在virtualhost配置中打开该指令.否则,apache将使用身份验证标头,并且不会将其传递给WSGI层.

<virtualhost *:443>
    ...

    WSGIPassAuthorization On

    ...
</virtualhost>
Run Code Online (Sandbox Code Playgroud)

更多信息在这里这里.

  • 在Python 2和3中尝试过,我得到了`AttributeError:'Request'对象没有属性'authentication'` (3认同)

Ban*_*ong 7

我最终找到了它,它可用作:

request.environ.get('REMOTE_USER')
Run Code Online (Sandbox Code Playgroud)

不知道这不是我唯一的问题,如果它对任何人都有用,这就是故事:

首先,我试图找出WSGI是否将身份验证信息传递给了flask.这个对不同问题的回答非常有用(它向您展示了如何看到WSGI在它到达瓶子之前提供的所有内容):

/sf/answers/80579061/

当我按照该答案列出WSGI信息时,它没有用户信息.但结果是因为在相关的网站启用的apache配置文件中为文档根目录(htdocs文件夹)配置了apache基本身份验证的设置.由于我使用WSGI将相关请求重定向到文档路径之外的文件夹,因此我实际上没有为我的页面启用身份验证.(而且我没有注意到,因为我在htdocs下访问了一些页面,被迫进行身份验证,并且当我进入我的刻录页面时,我认为没有被要求进行身份验证,因为身份验证已被缓存).在相关的apache站点启用文件中创建另一部分,为我的flask目录设置身份验证启用身份验证