typeError:使用烧瓶-JWT时,会期望字符串或字节形式的键



我有一个有关烧瓶python的问题。我尝试学习如何使用烧瓶构建网络,并且存在一些错误。在这种情况下,我将MongoEngine用作数据库和JWT(JSON Web令牌),并且警报错误是这样的:" TypeError:期待字符串 - 或字节形式或字节形式的密钥"

192.168.100.26 - - [22/Nov/2016 22:50:08] "POST /auth HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/home/def/.local/lib/python2.7/site-packages/flask/app.py", line 2000, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/def/.local/lib/python2.7/site-packages/flask/app.py", line 1991, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/def/.local/lib/python2.7/site-packages/flask/app.py", line 1567, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/def/.local/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/def/.local/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/def/.local/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/def/.local/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/def/.local/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/def/pr/flask/flask_deeper/test/routes/auth.py", line 26, in auth
    access_token = _jwt.jwt_encode_callback(identity)
  File "/usr/local/lib/python2.7/dist-packages/flask_jwt/__init__.py", line 70, in _default_jwt_encode_handler
    return jwt.encode(payload, secret, algorithm=algorithm, headers=headers)
  File "/usr/local/lib/python2.7/dist-packages/jwt/api_jwt.py", line 56, in encode
    json_payload, key, algorithm, headers, json_encoder
  File "/usr/local/lib/python2.7/dist-packages/jwt/api_jws.py", line 98, in encode
    key = alg_obj.prepare_key(key)
  File "/usr/local/lib/python2.7/dist-packages/jwt/algorithms.py", line 116, in prepare_key
    raise TypeError('Expecting a string- or bytes-formatted key.')
TypeError: Expecting a string- or bytes-formatted key.

我以为错误是

型号/user.py

@staticmethod
def jwt_handler(token):
    if not User.objects(token=token):
        raise JWTError("Bad bad bad bad")
    secret = str(current_app.config["JWT_SECRET_KEY"])
    algorithm = str(current_app.config["JWT_ALGORITHM"])
    options = {
        'verify_' + claim: True
        for claim in verify_claims
    }
    options.update({
        'require_' + claim: True
        for claim in required_claims
    })
    decode = jwt.decode(token, secret, options=options, algorithms=[algorithm])
    return decode
@staticmethod
def authenticate(username, password):
    user = User.objects(username=username)
    if len(user) == 0:
        return None
    user = user[0]
    user["id"] = str(user["id"])
    if crypt.verify(password, user.password):
        return user
    return user

路由/user.py

def auth():
    username = request.form.get("username")
    password = request.form.get("password")
    if not username:
        raise BadRequest("Userna doesn't exists")
    user = user_ctrl.read(username)
    identity = _jwt.authentication_callback(username, password)
    if identity:
        access_token = _jwt.jwt_encode_callback(identity)
        identity.update(push__token=access.decode("utf8"))
        return _jwt.auth_response_callback(access_token, identity)
    else:
        raise JWTError("Bad bad bad very bad")

config.py

import os
from test.models import db
class Config(object):
    db_name = os.getenv('MONGODB_NAME', 'third')
    db_host = os.getenv('MONGODB_HOST', '127.0.0.1')
    db_port  = os.getenv('MONGODB_PORT', '5000')
    JWT_SECRET_KEY = 'test123'
    JWT_ALGORITHM = 'SH256'
    JWT_AUTH_ENDPOINT = 'jwt'
    JWT_AUTH_USERNAME_KEY = 'username'
    JWT_AUTH_PASSWORD_KEY = 'password'

http.py

import logging.config
import jwt
from flask_jwt import JWT
from flask import Flask
from test import routes
from test.models import db, User
_jwt = JWT(authentication_handler=User.authenticate, identity_handler=User.identity)
_jwt.jwt_decode_callback=User.jwt_handler
def create_app(config):
    app = Flask(__name__.split(',')[0])
    app.register_blueprint(routes.user.bp)
    app.register_blueprint(routes.auth.bp)
    db.init_app(app)
    _jwt.init_app(app)
    return app

您已经定义了配置为 config.py,但尚未将配置对象添加到烧瓶应用中。因此,诸如JWT_SECRET_KEY之类的密钥不在您的应用程序配置中。

flask-jwt的default_handler期望这些值(在源更改中复制)

def _default_jwt_decode_handler(token):
    secret = current_app.config['JWT_SECRET_KEY']
    algorithm = current_app.config['JWT_ALGORITHM']
    leeway = current_app.config['JWT_LEEWAY']

在您的情况下,由于尚未设置,它返回None并trip algorithms.py(期望字符串键)。

因此,在http.py中的应用初始化期间,您必须将调用添加到app.config.from_object。也许这样的东西

def create_app(config):
    app = Flask(__name__.split(',')[0])
    # Edit the following to point it to your Config class
    app.config.from_object(config.Config)
    app.register_blueprint(routes.user.bp)
    app.register_blueprint(routes.auth.bp)
    db.init_app(app)
    _jwt.init_app(app)
    return app

在旁注上,JWT_ALGORITHM的名称应为HS256而不是SH256(尽管HS256是默认值,但由于SH256不是有效的算法,因此将被选中,

将被选择。

相关内容

最新更新