4

Flask プロジェクトで Flask-Security を使用しています。パスワード暗号化をオンにしようとするまで、基本的にすべてが機能します。基本的に私はこれに従いました: http://packages.python.org/Flask-Security/configuration.html これを追加することになりました:

app.config['SECURITY_PASSWORD_HASH'] = 'bcrypt'
app.config['SECURITY_PASSWORD_SALT'] = '$2a$16$PnnIgfMwkOjGX4SkHqSOPO'

これにより、残念ながらエラーが発生します。

File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__
return self.wsgi_app(environ, start_response)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app
response = self.full_dispatch_request()
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request
rv = self.dispatch_request()
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1344, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask_security/decorators.py", line 171, in wrapper
return f(*args, **kwargs)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask_security/views.py", line 72, in login
if form.validate_on_submit():
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask_wtf/form.py", line 123, in validate_on_submit
return self.is_submitted() and self.validate()
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask_security/forms.py", line 165, in validate
if not verify_password(self.password.data, self.user.password):
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask_security/utils.py", line 84, in verify_password
return _pwd_context.verify(get_hmac(password), password_hash)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/passlib/context.py", line 2534, in verify
record = self._get_or_identify_record(hash, scheme, category)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/passlib/context.py", line 2258, in _get_or_identify_record
return self._identify_record(hash, category)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/passlib/context.py", line 1455, in identify_record
raise ValueError("hash could not be identified")
ValueError: hash could not be identified

何が起こっているのか、私はむしろ無知です。私は良い bcrypt ハッシュを生成したと思っていましたが、Web サイトにはパスワード暗号化の実際の例がなく、エラー自体が私を混乱させます :/

使用したソフトウェア: - Ubuntu 12.04LTS - Python 2.7.2 - FLask 0.9 - Flask-Security 1.5.4 - MongoAlchemy を介して MongoDB 2.2 で実行

ご協力いただきありがとうございます!!

編集:Bikeshedderのおかげで、これが原因である可能性があります:

# Create a user to test with
@app.before_first_request
def create_user():
    user_datastore.create_user(email='test@test.net', password='testerdetest')

create_user メソッドがパスワードを自動的に暗号化すると仮定しました。しかし、明らかにそうではありません...ドキュメントはここではあまり明確ではありません:

Class flask_security.datastore.MongoEngineUserDatastore(db, user_model, role_model)
A MongoEngine datastore implementation for Flask-Security that assumes the use of the Flask-MongoEngine extension.
create_user(**kwargs)
Creates and returns a new user from the given parameters.

編集 2:BikeShedder の提案にさらに取り組み、標準のユーザー作成を次のように変更しました。

# Create a user to test with
@app.before_first_request
def create_user():
    user_datastore.create_user(email='test@test.net', password=bcrypt.hashpw('testerdetest', app.config['SECURITY_PASSWORD_SALT'])

これでエラーは解決しますが、「無効なパスワード」が表示されます。つまり、flask-security は、暗号化で行うこととは異なることを行います... ああ!

編集 3: bcrypt から passlib に変更 (flask-security も使用)

app.config['SECURITY_PASSWORD_SALT'] = '/2aX16zPnnIgfMwkOjGX4S'

user_datastore.create_user(email='test@test.net', password=passlib.hash.bcrypt.encrypt('testerdetest', salt=app.config['SECURITY_PASSWORD_SALT']))

それでも無効なpwを取得します:( https://github.com/mattupstate/flask-security/blob/develop/flask_security/utils.pyでソースコードを見ると、sha512暗号化のみを使用しているようです...私はドキュメントを理解していない...

編集5:解決しました(正しい方向に導いてくれてありがとう!)flask.ext.security.utils.encrypt_password()がうまくいきました。ただし、それが本当に bcrypt であるかどうかはまだ疑問ですが、大丈夫です。少なくとも暗号化されています...

4

3 に答える 3

5

このエラーがいつ発生するかを説明していないので、ログインしようとしたときに発生すると推測する必要があります.

この場合、DB に保存されているパスワードの形式が間違っていることを意味します。おそらくまだプレーン テキストであり、Flask-Security は使用中のハッシュ アルゴリズムを特定できません。

これを修正する最も簡単な方法は、ユーザーのパスワードをリセットすることです。

于 2013-01-28T13:28:32.283 に答える
1

古い質問ですが、開発者からの明確な回答...

それはすべて、ユーザーをデータベースに追加する方法によって異なります。SECURITY_REGISTERABLE = True を設定し、組み込みの登録フォームからのみユーザーを追加する場合は、問題ありません。他の方法でユーザーを追加する場合は、データベースにユーザー レコードを保存する前に、flask_security.utils.encrypt_password を使用してパスワードを暗号化する必要があります。

from flask.ext.security.utils import encrypt_password
db.create_user(email='test@test.com', password=encrypt_password('password'))
于 2014-03-12T01:13:16.897 に答える