[英]I'm getting an error while using Flask_JWT with Mongoengine 'dict' object has no attribute 'id'
[英]“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.