Recibí este error en la aplicación Flask:
curl http://0.0.0.0:8080/ -H "Authorization: Bearer TGazPL9rf3aIftplCYDTGDc8cbTd" { "msg": "Not enough segments" }Aquí una muestra:
from flask import Flask from flask_restful import Resource, Api from flask_jwt_extended import JWTManager, jwt_required app = Flask(__name__) jwt = JWTManager(app) api = Api(app) class HelloWorld(Resource): @jwt_required def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/')Consola:
* Serving Flask app "app.py" (lazy loading) * Environment: development * Debug mode: on * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 890-265-009 127.0.0.1 - - [26/Apr/2020 02:02:32] "GET / HTTP/1.1" 422 -No puedo entender: ¿Qué pasa?
La excepción se lanzó en otra biblioteca (línea 183 en site-packages/jwt/api_jws.py):
def _load(self, jwt): if isinstance(jwt, text_type): jwt = jwt.encode('utf-8') if not issubclass(type(jwt), binary_type): raise DecodeError("Invalid token type. Token must be a {0}".format( binary_type)) try: signing_input, crypto_segment = jwt.rsplit(b'.', 1) header_segment, payload_segment = signing_input.split(b'.', 1) except ValueError: raise DecodeError('Not enough segments')El token que intenta pasar ( TGazPL9rf3aIftplCYDTGDc8cbTd ) no es un JWT válido. Un JWT válido tiene tres segmentos separados por puntos: <base64_encoded_header>.<base64_encoded_payload>.<signature> . Puede leer más sobre esto aquí: https://jwt.io/introduction/
Publicaré aquí una respuesta relacionada con mi problema inicial anterior, el contexto es que estaba tratando de utilizar el usuario matraz_jwt_extend para usar en la autenticación de base de fuego, pero tengo este error "No hay suficientes segmentos" y me bloquearon.
Entonces, después de eso, cambio mi código a:
from flask import Flask, request from flask_restful import Resource, Api from functools import wraps import google.auth.transport.requests import google.oauth2.id_token app = Flask(__name__) api = Api(app) HTTP_REQUEST = google.auth.transport.requests.Request() def jwt_required_gcp(fn): @wraps(fn) def wrapper(*args, **kwargs): id_token = request.headers['Authorization'].split(' ').pop() claims = google.oauth2.id_token.verify_firebase_token( id_token, HTTP_REQUEST) if not claims: return 'Unauthorized', 401 return fn(*args, **kwargs) return wrapper class HelloWorld(Resource): @jwt_required_gcp def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/')Verifique su token JWT. ¿Es válido?
@fresh_jwt_required - función fresh_jwt_required() para permitir que solo tokens nuevos accedan a cierto punto final
@jwt_required: un decorador para proteger un extremo de Flask con tokens web JSON. Cualquier ruta decorada con esto requerirá que un JWT válido esté presente en la solicitud (a menos que opcional = Verdadero, en cuyo caso ningún JWT también es válido) antes de que se pueda llamar al punto final.
Para obtener más detalles, revise el matraz-jwt-extendido