簡體   English   中英

Flask-JWT-Extended:@jwt_refresh_token_required 注釋不起作用

[英]Flask-JWT-Extended: @jwt_refresh_token_required annotation does not work

我有一個登錄資源( /login端點),遵循 Oleg Agapov 的教程

class UserLogin(Resource):
    def post(self):
        data = parser.parse_args()
        current_user = User.find_by_email(data['email'])

        if not current_user:
            return {'message': 'User {} doesn\'t exist'.format(data['email'])}

        if User.verify_hash(data['password'], current_user.password):
            refresh_token = create_refresh_token(identity = data['email'])
            return {
                'message': 'Logged in as {}'.format(current_user.email),
                'refresh_token': refresh_token
                }
        else:
            return {'message': 'Wrong credentials'}

使用正確的憑據調用此端點,我確實得到了響應:

{
  "message": "Logged in as test@gmail.com",
  "refresh_token": "eyJ0eXAiOiJKV1.............TheVeryLongRefreshTokenString...........JfkRatZ2NaA72Tl4b9C4-e3d6kXA"
}

現在,我在/secret端點上有一個測試資源:

class SecretResource(Resource):
    @jwt_refresh_token_required
    def get(self):
        return {
            'answer': 42
        }

使用請求中包含的作為承載 header 的refresh_token調用此端點應返回:

{
   "answer": 42
}

如果沒有@jwt_refresh_token_required注釋(不發送任何令牌),這正是我得到的。 但是我需要注釋來保護我的端點並滿足一些令牌要求。

只是它不起作用。 使用Authentication: Bearer *Refresh_Token* header 我只得到:

{
   "message": "Internal Server Error"
}

在此處輸入圖像描述

我知道access_token應該用於此,但我不希望它的 15 分鍾到期時間。 我不明白為什么會出現問題,因為我們正在使用需要refresh_token的端點來刷新access_token本身。 我當然可能是錯的。

這是poject_folder根文件夾的__init__.py的片段,其中檢查了撤銷:

@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
    jti = decrypted_token['jti']
    return poject_folder.Model.RevokedTokenModel.is_jti_blacklisted(jti)

我在這里想念什么?

正如@vimalloc所建議的,我需要添加

app.config['PROPAGATE_EXCEPTIONS'] = True

在配置應用程序 object 時查看實際錯誤,導致代碼中斷並返回代碼 500

答案非常簡單, __init__.py init__.py 文件中的令牌檢查回調 function 正在引用自身,因此我不得不刪除project_folder前綴:

由此:

@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
    jti = decrypted_token['jti']
    return poject_folder.Model.RevokedTokenModel.is_jti_blacklisted(jti)

對此:

@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
    jti = decrypted_token['jti']
    return Model.RevokedTokenModel.is_jti_blacklisted(jti)

暫無
暫無

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

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