Web applications 如何使用纯Javascript设置持久的基本身份验证?

Web applications 如何使用纯Javascript设置持久的基本身份验证?,web-applications,flask,basic-authentication,Web Applications,Flask,Basic Authentication,我正在开发一个用Flask编写的简单web应用程序,以从零开始理解浏览器身份验证。作为第一步,我添加了基本身份验证,只是为了停止匿名访问,使用: from functools import wraps from flask import request, Response def check_auth(username, password): """This function is called to check if a username / password combin

我正在开发一个用Flask编写的简单web应用程序,以从零开始理解浏览器身份验证。作为第一步,我添加了基本身份验证,只是为了停止匿名访问,使用:

from functools import wraps
from flask import request, Response


def check_auth(username, password):
    """This function is called to check if a username /
    password combination is valid.
    """
    return username == 'admin' and password == 'secret'

def authenticate():
    """Sends a 401 response that enables basic auth"""
    return Response(
    'Could not verify your access level for that URL.\n'
    'You have to login with proper credentials', 401,
    {'WWW-Authenticate': 'Basic realm="Login Required"'})

def requires_auth(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        auth = request.authorization
        if not auth or not check_auth(auth.username, auth.password):
            return authenticate()
        return f(*args, **kwargs)
    return decorated
资料来源:

就安全性而言,它运行良好。但问题是它会提示我输入用户名和密码。一旦我给出用户名和密码,授权就会持久。所以我的问题是:

1) 授权是如何持久的?在整个浏览器会话中,基本授权是否存储在请求标头中?我可以看到,当我打开一个隐姓埋名窗口时,我需要再次键入一次


2) 为了使其更加用户友好,我是否可以拥有一个登录页面来完成上述工作,即使用纯Javscript在浏览器会话中设置持久的基本授权,而不是使用浏览器弹出窗口?

您应该下载像firebug这样的工具,并观察标题在您的请求中来回移动。这将对您的浏览器如何在没有用户名和密码的情况下进行重新身份验证有所启发

除非我完全理解它。这段代码所做的就是发送一个401,在这行中包含一个基本的请求质询

   {'WWW-Authenticate': 'Basic realm="Login Required"'})
这是在发送一个响应头。当浏览器获得此信息时,它将Basic视为身份验证协议,并启动一个对话框。此对话框是弹出的浏览器,要求输入密码,以便对远程资源进行身份验证。完成此操作后,它将在该选项卡或浏览器的生命周期内(取决于浏览器本身)记住并发送身份验证。这是一个关于让浏览器忘记这一点的讨论(请参见“结束很麻烦”)

至于第二个问题。。。它基本上是一个复制品

但总而言之,您需要向客户端请求凭据,然后执行协商。一些框架允许静默基本身份验证。因此,如果您获得用户名/密码,base64对其进行编码,并将其放入头中,那么服务器就有了需要验证的信息。其他框架使用令牌来持久化会话的身份验证。因此,您可以拥有一个不受保护的资源
/login.html
,然后将表单发布到登录端点。似乎涵盖了基于flask的登录页面

当然,这只能通过https等进行