你好!
我有一个使用 HTTP 基本身份验证保护的路由,该身份验证由 Flask-HTTPAuth 实现。如果我使用curl,一切都工作正常(我可以访问路由),但是在单元测试时,即使我为其提供了正确的用户名和密码,也无法访问该路由。
以下是我的测试模块中的相关代码片段:
class TestClient(object):
def __init__(self, app):
self.client = app.test_client()
def send(self, url, method, data=None, headers={}):
if data:
data = json.dumps(data)
rv = method(url, data=data, headers=headers)
return rv, json.loads(rv.data.decode('utf-8'))
def delete(self, url, headers={}):
return self.send(url, self.client.delete, headers)
class TestCase(unittest.TestCase):
def setUp(self):
app.config.from_object('test_config')
self.app = app
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()
self.client = TestClient(self.app)
def test_delete_user(self):
# create new user
data = {'username': 'john', 'password': 'doe'}
self.client.post('/users', data=data)
# delete previously created user
headers = {} …Run Code Online (Sandbox Code Playgroud) 当我尝试使用@auth.login_required装饰器访问路径时,系统会提示我输入用户名和密码.进入此信息后,参数username_or_token和password对verify_password功能的''.为什么数据是空的?
@auth.verify_password
def verify_password(username_or_token, password):
# first try to authenticate by token
user = USER.verify_auth_token(username_or_token)
logger.debug("user = %r", user)
logger.debug("Entered USEREMAIL = %r" , username_or_token)
logger.debug("entered password = %r" , password)
if not user:
# try to authenticate with username/password
user = session.query(USER).filter_by(USEREMAIL=username_or_token).first()
if not user or not user.verify_password(password):
return False
g.user = user
return True
Run Code Online (Sandbox Code Playgroud)
UPDATE
我已将代码简化为:
@auth.verify_password
def verify_password(username, password):
logger.debug("username = %s" % username)
logger.debug("password = %s" …Run Code Online (Sandbox Code Playgroud) 我正在使用Flask-HTTPAuth来处理我的应用程序中的身份验证.我有很多观点,我不想添加login_required到每一个观点.如何默认登录?
from flask.ext.httpauth import HTTPBasicAuth
auth = HTTPBasicAuth()
@auth.verify_password
def verify_password(username, password):
return username == '111' and password == '222'
@app.route('/')
@app.route('/home/')
@auth.login_required
def index():
return 'Hello'
@app.route('/route2/')
def route2():
return 'route2'
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
Run Code Online (Sandbox Code Playgroud) 我想知道是否有人使用这个烧瓶扩展来简化http-basic-auth.
基本上我不明白这个例子:
users = {
"john": "hello",
"susan": "bye"
}
@auth.get_password
def get_pw(username):
if username in users:
return users[username]
return None
Run Code Online (Sandbox Code Playgroud)
该get_password装饰好像返回给用户的清除密码,如果它给用户提供了一个相匹配,则授权将被授予.
但是,没有人应该首先访问用户的明确密码.我通常会将明确的密码和用户名发送到后端,散列密码并将其与数据库中现有的哈希密码进行比较.
这是如何设想的?
更新:
与文档的链接更加轻松.因为有第二个装饰器需要实现这个:
@auth.hash_password
def hash_pw(username, password):
get_salt(username)
return hash(password, salt)
Run Code Online (Sandbox Code Playgroud)
字面上的规则是 get_password(username) == hash_password(password)
我理解这一点的方法是get_password在数据库中返回用户的哈希密码,该密码需要等于hash_password方法中定义的当前哈希密码.
问题是,我使用的是passlib中的sha256_crypt.
def verify_password(password, hashed_password_in_db, password_hash_version):
if password_hash_version == 1:
return sha256_crypt.verify(password, hashed_password_in_db)
return False
Run Code Online (Sandbox Code Playgroud)
在这里,您不能散列给定的密码并将其与存储的散列密码进行比较.我必须使用sha256_crypt.verify(password, hashed_password_in_db)返回false或true的方法.
有没有办法实现这一点,还是我必须推出自己的自定义解决方案?谢谢
我正在尝试使用具有多个HTTP(GET,POST,PUT,DELETE)方法的相同URL,并且对于每个方法,它使用flask-auth进行不同的身份验证.
我尝试创建的不仅仅是类
class GetUser(Resource):
decorators = [Users.auth.login_required]
def get(self):
'''..etc'''
class PostUser(Resource):
decorators = [Admin.auth.login_required]
def post(self):
'''..etc'''
restful_api.add_resource(GetUser,'/User')
restful_api.add_resource(PostUser,'/User')
Run Code Online (Sandbox Code Playgroud)
但是会发生什么事情restful_api.add_resource(PostUser,'/User')会覆盖restful_api.add_resource(GetUser,'/User')
authentication flask python-2.7 flask-restful flask-httpauth
我有一个实现REST api的flask应用程序。由于某些原因,我正在使用HTTP摘要式身份验证。我已经使用了Flask-HTTPAuth库来实现摘要身份验证,并且它可以工作。但是,我无法在单元测试中进行身份验证。
对于单元测试,在设置身份验证之前,我正在执行以下操作:
class FooTestCase(unittest.TestCase):
def setUp(self):
self.app = foo.app.test_client()
def test_root(self):
response = self.app.get('/')
# self.assert.... blah blah blah
Run Code Online (Sandbox Code Playgroud)
在实施身份验证之前,这很好。现在,我得到一个401,它应作为摘要auth请求的初始响应。我进行了搜索,并遵循了一些与http基本身份验证相关的建议(使用参数data = {#various stuff}和follow_redirects = True),但是我没有成功。
在这种情况下,有谁知道如何实施单元测试?
python digest-authentication flask python-unittest flask-httpauth
我正在使用Flask-HTTPAuth进行身份验证。我想从视图显示不同的数据,具体取决于请求是否已通过身份验证。装饰视图auth.login_required仅将其显示给已验证的用户。如何测试请求是否已通过Flask-HTTPAuth进行身份验证?
auth = HTTPBasicAuth()
@app.route("/clothesInfo")
@auth.login_required
def show_info():
return jsonify(blah blah blah)
Run Code Online (Sandbox Code Playgroud) 我对此做了很多研究,包括尝试这样的答案。看来 Celery 无法访问我的 Flask 应用程序的上下文。
我完全了解我的 celery 对象,它将装饰我的任务,必须能够访问我的 Flask 应用程序的上下文。我确实相信它应该,因为我按照本指南创建了我的芹菜对象。我不确定混淆是否存在于我使用 Flask-HTTPAuth 的事实中。
这是我所拥有的一些内容。
def make_celery(app):
celery = Celery(app.import_name, backend=app.config["CELERY_RESULT_BACKEND"], broker=app.config["CELERY_BROKER_URL"])
celery.conf.update(app.config)
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
app = Flask(__name__)
auth = HTTPBasicAuth()
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///flask_app.db"
app.config["CELERY_BROKER_URL"] = "redis://localhost:6379"
app.config["CELERY_RESULT_BACKEND"] = "redis://localhost:6379"
celery = make_celery(app)
db = SQLAlchemy(app)
@celery.task(bind=True, name="flask_app.item_loop")
def loop(self):
items = g.user.items
for item in items: …Run Code Online (Sandbox Code Playgroud) 在Flask应用程序上进行工作,该应用程序将具有要针对其进行身份验证的单独的路由类别:用户路由和主机路由(请考虑使用Airbnb风格的用户和主机存在很大差异)。
创建单个verify_password回调和login_required组合非常简单,但是这还不够,因为某些路由需要主机身份验证,而其他路由则需要用户身份验证。从本质上讲,我将需要为用户提供一个verify_password / login_required,为主机提供一个,但由于似乎回调相对于auth的作用域是全局的,因此我似乎无法弄清楚该怎么做。
我目前正在使用Flask-RESTful构建REST API,并使用Flask-HTTPAuth来保护一些put和get方法.我想允许基于我存储在数据库中的预定义用户权限来访问这些方法.
我的问题是,如何修改或拦截下面函数的结果,以便根据端点/方法改变访问权限?清除基本身份验证后,我希望能够检查用户是否在我的数据库中具有相关权限.使用Flask-Session这很简单,但这里的API是无状态的.
@auth.verify_password
def verify_password(user, password):
query_set = models.User.objects(username=user)
if query_set:
return helpers.verify(password, query_set[0].password)
else:
return False
Run Code Online (Sandbox Code Playgroud)
非常感谢你.
每当我尝试使用flask_httpauth 为我的flask_restful 项目启用身份验证时,我都会收到此错误:
AttributeError: 'function' object has no attribute 'as_view'
Run Code Online (Sandbox Code Playgroud)
这是一个非常基本的示例:apicontroller.py:
from flask_restful import Resource, Api
from flasktest import api, app
from flask_httpauth import HTTPTokenAuth
auth = HTTPTokenAuth()
@auth.login_required
class ApiController(Resource):
def get(self):
return True
api.add_resource(ApiController, '/api/apicontroller')
Run Code Online (Sandbox Code Playgroud)
初始化.py:
from flask import render_template
from flask import Flask, request, render_template, session, flash, redirect, url_for, jsonify
from flask_restful import Resource, Api, reqparse, fields
from flask_httpauth import HTTPTokenAuth
app = Flask(__name__)
api = Api(app)
import flasktest.apicontroller
Run Code Online (Sandbox Code Playgroud)
每当我用 装饰控制器类时@auth.login_required,它都会失败并出现上述错误。我怎样才能解决这个问题?