簡體   English   中英

“描述”:POSTMAN 中使用 flask_jwt 的“無效憑據”

[英]“description”: “Invalid credentials” in POSTMAN using flask_jwt

我正在嘗試進行身份驗證並獲取訪問令牌。 我創建了用戶 class,我正在嘗試在身份驗證時從 POSTMAN 運行 POST 方法,但我收到一些錯誤:

{
  "description": "Invalid credentials",
  "error": "Bad Request",
  "status_code": 401
}

我找不到任何解決方案。

app.py 的代碼

from flask import Flask, request
from flask_restful import Resource, Api
from flask_jwt import JWT, jwt_required
from security import authenticate, identity

# creating flask app
app = Flask(__name__)
app.secret_key = 'vishwas'
api = Api(app)

jwt = JWT(app, authenticate, identity) # /auth

# empty list of items
items = []

class Item(Resource):
    @jwt_required()
    def get(self,name):
        # next return first value that found by the filter function
        # next(filter(), None) -> 'None' to handle the eroor if the list is empty
        item = next(filter(lambda x: x['name'] == name,items), None)
        return {'item': item}, 200 if item else 404
# http://127.0.0.1.5000/item/<string:name>
api.add_resource(Item, '/item/<string:name>')
app.run(port=5000, debug=True)

security.py 的代碼

from werkzeug.security import safe_str_cmp
from user import User

# list of users
users = [
    User(1,"bob","pass")
]

# users information using their username
username_mapping = {user.username: user for user in users}

# users information using their userid
userid_mapping = {user.id: user for user in users}

def authenticate(username,password):
    user = userid_mapping.get(username, None)
    if user and safe_str_cmp(user.password, password):
        return user

def identity(payload):
    user_id = payload['identity']
    return userid_mapping.get(user_id, None)

user.py 的代碼

class User:

    def __init__(self,_id,username,password):
        self.id = _id
        self.username = username
        self.password = password

如您所見,我已經正確實現了代碼,但我仍然收到此“無效憑據”或“錯誤請求”錯誤。

確保使用用戶名而不是名稱

    "name": "mostafa",
    "password": "pass"
}

應該是這個

    "username": "mostafa",
    "password": "pass"
}

如果您查看數據中存儲的內容:

def authenticate(username, password):
    print(username_mapping)

我們會看到:

{('bob',): <user.User object at 0x000002C7DC982B00>}

也就是 ('bob',) 鍵,不是 bob 我自己只研究potshon,所以決定只做這個

def authenticate(username, password):
    user = username_mapping.get(('{}'.format(username),), None)
    if user and safe_str_cmp(user.password, password):
        return user

你錯了,而不是username_mapping,你正在使用userid_mapping 相應地:

def identity(payload):
    user_id = payload['identity']
    return userid_mapping.get((user_id[0],), None)

我不知道多少是正確的,很可能需要將初始數據轉換為正確的類型,但它可以工作。 也許有人會告訴你如何更正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM