1

按照 Oleg Agapov 的教程,我有一个登录资源(/login端点):

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
        }

在请求中使用包含的承载标头调用此端点refresh_token应返回:

{
   "answer": 42
}

没有@jwt_refresh_token_required注释(不发送任何令牌)这正是我得到的。但是我需要注释来保护我的端点并满足一些令牌要求。

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

{
   "message": "Internal Server Error"
}

在此处输入图像描述

我知道access_token应该使用它,但我不想要它的 15 分钟到期时间。我不明白为什么会出现问题,因为我们正在做同样的事情来access_token使用需要refresh_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)

我在这里想念什么?

4

1 回答 1

0

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

app.config['PROPAGATE_EXCEPTIONS'] = True

在配置应用程序对象查看实际错误时,导致代码中断并返回代码 500

答案非常简单,__init__.py文件中的令牌检查回调函数引用了自己,所以我不得不删除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)
于 2019-10-31T19:44:38.893 回答