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

4

我正在开发一个简单的基于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

来源: http://flask.pocoo.org/snippets/8/

从安全性角度来看,这很好。但问题在于它会提示我输入用户名和密码。一旦我提供了用户名和密码,授权就是持久的。所以我的问题是:

1) 授权为什么是持久的? 基本授权是否在整个浏览器会话期间存储在请求头中?我可以看到当我打开一个无痕窗口时,我需要再次输入一次。

2) 为了使其更加用户友好,我能否使用纯JavaScript创建一个登录页面来设置持久的基本授权,而不是使用浏览器弹出窗口进行操作?

1个回答

3
您应该下载像Firebug这样的工具,观察您的请求来回传递的标头。这将使您了解您的浏览器如何在没有用户名和密码的情况下重新进行身份验证。
除非我完全误解了Flask。所有这些代码所做的就是发送一个带有基本请求挑战的401行。
   {'WWW-Authenticate': 'Basic realm="Login Required"'})

这段文字的作用是发送一个响应头。当浏览器收到此响应时,它会将Basic视为认证协议并启动对话框。该对话框是浏览器弹出的,要求输入密码以便对远程资源进行身份验证。在您完成此操作后,该选项卡或浏览器(取决于浏览器本身)将记住并自动发送身份验证信息。这里有一个讨论,关于如何使浏览器忘记这些信息(关闭很麻烦)。
至于第二个问题……基本上是这个的重复。
但总的来说,您需要要求客户端提供凭据,然后进行协商。一些框架允许静默基本身份验证。因此,如果您获得了用户名/密码,对其进行base64编码,将其放入标头中,那么服务器就有了所需的信息进行身份验证。其他框架使用令牌来保持会话的身份验证。因此,您可以拥有一个未受保护的资源/login.html,然后将表单发布到登录终点。 似乎涵盖了基于flask的登录页面。
当然,这应该只在https等安全的环境下完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接