gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:05:40 24 4
gpt4 key购买 nike

我正在开发一个用 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)授权如何持久?在整个浏览器 session 期间,基本授权是否存储在请求 header 中?我可以看到,当我打开一个隐身窗口时,我再次只需要输入一次。

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

最佳答案

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

除非我完全误解了 Flask。所有这些代码正在做的就是在这一行发送一个带有基本请求挑战的 401

   {'WWW-Authenticate': 'Basic realm="Login Required"'})

这样做是发送响应 header 。当浏览器收到此信息时,它会将 Basic 视为身份验证协议(protocol)并启动一个对话框。此对话框是浏览器弹出并要求输入密码,以便它可以对远程资源进行身份验证。完成此操作后,它将在该选项卡或浏览器的整个生命周期内(取决于浏览器本身)记住并发送身份验证。 Here是关于让浏览器忘记这一点的讨论(见关闭很麻烦)

至于第二个问题……它基本上是 this 的重复。

但总而言之,您需要向客户端询问凭据,然后执行协商。一些框架允许静默基本身份验证。因此,如果您获得用户名/密码,则对其进行 base64 编码,将其塞入 header 中,然后服务器将获得验证所需的信息。其他框架使用 token 来保持 session 的身份验证。所以你可以拥有一个不 protected 资源 /login.html然后将表单发布到登录端点。 This似乎涵盖了基于 flask 的登录页面。

当然,这只能通过 https 等来完成。

关于web-applications - 如何使用纯 Javascript 设置持久基本身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37019908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com