Autenticação opcional Flask JWT

O problema é que, ao usar o Flask-JWT, a identidade atual não é enviada para a pilha de contexto, o que significa que mesmo o usuário passa um token, a identidade atual é Nenhum, você pode corrigir isso usando este decorador

from flask_jwt import _jwt
from flask import _request_ctx_stack
from functools import wraps
import jwt

def jwt_optional(realm=None):
def wrapper(fn):
@wraps(fn)
def decorator(*args, **kwargs):
token
= _jwt.request_callback()
try:
payload
= _jwt.jwt_decode_callback(token)
except jwt.exceptions.DecodeError:
pass
else:
_request_ctx_stack
.top.current_identity = _jwt.identity_callback(payload)
return fn(*args, **kwargs)
return decorator
return wrapper

ou melhor ainda, registre um retorno de chamada para antes da solicitação

@app.before_request
def push_to_ctx():
token
= _jwt.request_callback()
try:
payload
= _jwt.jwt_decode_callback(token)
except jwt.exceptions.DecodeError:
pass
else:
_request_ctx_stack
.top.current_identity = _jwt.identity_callback(payload)