1

安全.py

    从用户导入用户    
    从 werkzeug.security 导入 safe_str_cmp

    用户=[用户(1,'abc','abc')]

    username_mapping = {u.username:u for u in users}

    userid_mapping = {u.uid: u for u in users}

    def 验证(用户名,密码):
        用户=用户名映射.get(用户名,无)
        如果用户和 safe_str_cmp(user.password , 密码):
            回头客

    def 身份(有效负载):
        user_id=payload['身份']
        返回 userid_mapping.get(user_id,None)


应用程序.py

    从烧瓶进口烧瓶,请求  
    从 flask_restful 导入 Api,Resource
    从 flask_jwt 导入 JWT,jwt_required  
    从安全导入身份验证,身份


    app = Flask(__name__)  
    app.security_key='酷'  
    api = API(应用程序)


    jwt = JWT(app,authenticate,identity) #创建新端点 /auth


上述 JWT 函数的 /auth POST 方法显示 500 Internal server error 并给出以下错误日志

回溯(最近一次通话最后):
  wsgi_app 中的文件“/usr/lib/python3.7/site-packages/flask/app.py”,第 2292 行
    响应 = self.full_dispatch_request()
  文件“/usr/lib/python3.7/site-packages/flask/app.py”,第 1815 行,在 full_dispatch_request
    rv = self.handle_user_exception(e)
  文件“/usr/lib/python3.7/site-packages/flask_restful/__init__.py”,第 273 行,在 error_router
    返回 original_handler(e)
  文件“/usr/lib/python3.7/site-packages/flask/app.py”,第 1718 行,在 handle_user_exception
    reraise(exc_type, exc_value, tb)
  文件“/usr/lib/python3.7/site-packages/flask/_compat.py”,第 35 行,在 reraise
    升值
  文件“/usr/lib/python3.7/site-packages/flask/app.py”,第 1813 行,在 full_dispatch_request
    rv = self.dispatch_request()
  文件“/usr/lib/python3.7/site-packages/flask/app.py”,第 1799 行,在 dispatch_request 中
    return self.view_functions[rule.endpoint](**req.view_args)
  _default_auth_request_handler 中的文件“/home/iamabhi67/.local/lib/python3.7/site-packages/flask_jwt/__init__.py”,第 125 行
    access_token = _jwt.jwt_encode_callback(身份)
  _default_jwt_encode_handler 中的文件“/home/iamabhi67/.local/lib/python3.7/site-packages/flask_jwt/__init__.py”,第 62 行
    有效载荷 = _jwt.jwt_payload_callback(身份)
  _default_jwt_payload_handler 中的文件“/home/iamabhi67/.local/lib/python3.7/site-packages/flask_jwt/__init__.py”,第 53 行
    identity = getattr(identity, 'id') 或 identity['id']
AttributeError:“列表”对象没有属性“id”
4

3 回答 3

1

返回应该是用户,而不是用户

  def authenticate(username,password):
    user= username_mapping.get(username,None)
    if user and safe_str_cmp(user.password , password):
        return user
于 2021-05-04T18:48:53.600 回答
0

您的authenticate函数返回users这是一个列表。它应该返回一个用户对象(它有一个id属性)。查看快速入门

于 2019-03-18T20:26:27.650 回答
0
userid_mapping = {u.uid: u for u in users}

你在你的字典id中设置。uid理解,您的代码适用于{u.id: u for u in users}(至少在我的机器上)。JWT 正在寻找id属性,但没有发现它会引发讨厌的异常。

于 2020-05-12T01:58:11.407 回答