【问题标题】:generating token for flask-jwt giving incorrect method error为flask-jwt生成令牌给出不正确的方法错误
【发布时间】:2018-07-28 08:36:07
【问题描述】:

我在项目中使用了flask-jwt,并在controller.py中声明:

def _validate_user(email, password):
    """
    validates user from db
    """
    user = Users.get_user(email)
    if check_password_hash(user.password_hash, password):
        return user
    else:
        return None


def verify(email, password):
    if not (email and password):
        return False
    valid_user = _validate_user(email, password)
    if valid_user:
        return valid_user


def identity(payload):
    user_id = payload["identity"]
    return {"userid", user_id}

然后在 api 的 view.py 模块上我有这个

from flask_jwt import JWT, jwt_required
from ..controller import (
    verify,
    identity
    )
jwt = JWT(app, verify, identity)

我使用电子邮件作为用户名概念,我没有向用户询问他的用户名,而是使用用户的电子邮件地址作为用户名,我在models.py 中定义了这样的表:

class Users(UserMixin, db.Model):
    """ Stores the user information
    """

    __tablename__ = "users"

    userid = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(60), index=True, unique=True, nullable=False)
    password_hash = db.Column(db.String(255), nullable=False)
    registered_on = db.Column(db.DateTime, default=datetime.utcnow())
    authenticated = db.Column(db.Boolean, default=False)
    admin = db.Column(db.Boolean, nullable=False, default=False)

curl -H "Content-Type: application/json"  -u san@test.com:test -i -X GET http://127.0.0.1:5000/auth

但使用上述方法时,我不断收到错误方法不允许,如果我尝试使用 POST,我会收到错误提示无法解码 <p>Failed to decode JSON object: No JSON object could be decoded</p>

我很困惑发生了什么,办公室里类似的设置正在工作,但我是根据我能记得的内容实现的.. 似乎我错过了这一点。

【问题讨论】:

  • 不是您问题的答案,但也许可以考虑查看 Flask-JWT-Extended:flask-jwt-extended.readthedocs.io/en/latest。 Flask-JWT 已经被废弃了一段时间了。
  • @vimalloc 让我头疼的是,当类似的设置在办公室工作时,为什么它现在不能在个人开发项目中工作。

标签: curl http-headers flask-jwt pyjwt flask-jwt-extended


【解决方案1】:

回复有点晚,但我猜你的问题出在curl 命令中:

curl -H "Content-Type: application/json"  -u san@test.com:test -i -X GET http://127.0.0.1:5000/auth

-u 选项用于指定服务器身份验证的用户名和密码,使用 HTTP 基本身份验证,以便将数据打包在 headers 中。

JWT 库要求用户名和密码为 JSON,因此:

  • 你必须发送一个 POST 请求
  • 您必须在 JSON 正文中添加用户名和密码

    curl --header "Content-Type: application/json" \
         --request POST \
         --data '{"username":"san@test.com","password":"test"}' \
         http://127.0.0.1:5000/auth
    

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2021-07-29
    • 2023-02-22
    • 2023-03-05
    相关资源
    最近更新 更多