标签: flask-httpauth

Flask http-auth 和单元测试

你好!

我有一个使用 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)

python flask flask-httpauth

6
推荐指数
1
解决办法
2727
查看次数

Flask-HTTPAuth verify_password函数未接收用户名或密码

当我尝试使用@auth.login_required装饰器访问路径时,系统会提示我输入用户名和密码.进入此信息后,参数username_or_tokenpasswordverify_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)

python http-authentication flask flask-httpauth

5
推荐指数
2
解决办法
4169
查看次数

默认login_required而不是在任何地方添加装饰器

我正在使用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)

python flask flask-httpauth

4
推荐指数
1
解决办法
1095
查看次数

flask-httpauth:get_password装饰器如何用于basic-auth?

我想知道是否有人使用这个烧瓶扩展来简化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的方法.

有没有办法实现这一点,还是我必须推出自己的自定义解决方案?谢谢

python flask flask-httpauth

3
推荐指数
2
解决办法
1983
查看次数

flask-restful with flask-auth:具有不同身份验证的多个HTTP方法

我正在尝试使用具有多个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

3
推荐指数
1
解决办法
1314
查看次数

如何在Flask中对HTTP摘要式身份验证进行单元测试?

我有一个实现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

3
推荐指数
1
解决办法
906
查看次数

检查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)

python flask flask-httpauth

3
推荐指数
1
解决办法
551
查看次数

使用 Celery Worker 与 SQLAlchemy DB 交互,包括从请求中了解用户

我对此做了很多研究,包括尝试这样的答案。看来 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)

python celery flask flask-sqlalchemy flask-httpauth

3
推荐指数
1
解决办法
5020
查看次数

flask-httpauth上的多个verify_password回调

在Flask应用程序上进行工作,该应用程序将具有要针对其进行身份验证的单独的路由类别:用户路由和主机路由(请考虑使用Airbnb风格的用户和主机存在很大差异)。

创建单个verify_password回调和login_required组合非常简单,但是这还不够,因为某些路由需要主机身份验证,而其他路由则需要用户身份验证。从本质上讲,我将需要为用户提供一个verify_password / login_required,为主机提供一个,但由于似乎回调相对于auth的作用域是全局的,因此我似乎无法弄清楚该怎么做。

python flask flask-httpauth

1
推荐指数
1
解决办法
103
查看次数

Flask-HTTPAuth用户访问级别

我目前正在使用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)

非常感谢你.

python rest flask flask-restful flask-httpauth

1
推荐指数
1
解决办法
773
查看次数

启用身份验证时 Flask-restful 应用程序失败

每当我尝试使用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,它都会失败并出现上述错误。我怎样才能解决这个问题?

python flask-restful flask-httpauth

0
推荐指数
1
解决办法
1383
查看次数