"Not enough segments" 发送带有 Bearer Token 授权的 GET 消息时 Header (flask_restful + flask_jwt_extended)
"Not enough segments" when seding a GET message with Bearer Token Authorization Header (flask_restful + flask_jwt_extended)
我在 Flask 应用程序中遇到这个错误:
curl http://0.0.0.0:8080/ -H "Authorization: Bearer TGazPL9rf3aIftplCYDTGDc8cbTd"
{
"msg": "Not enough segments"
}
这里有一个示例:
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, '/')
控制台:
* 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 -
我不明白:怎么了?
其他库抛出异常(site-packages/jwt/api_jws.py中第183行):
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')
您尝试传入的令牌 (TGazPL9rf3aIftplCYDTGDc8cbTd
) 不是有效的 JWT。一个有效的 JWT 包含三个由点分隔的部分:<base64_encoded_header>.<base64_encoded_payload>.<signature>
。您可以在这里阅读更多相关信息:https://jwt.io/introduction/
我会 post 在这里回答与我上面的初始问题相关的问题,上下文是我试图让用户 flask_jwt_extend 在 firebase 身份验证中使用,但我有这个 "Not enough segments" 错误,我被阻止了。
所以在那之后,我将我的代码更改为:
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, '/')
检查您的 JWT 令牌。有效吗?
@fresh_jwt_required - fresh_jwt_required() 函数只允许新令牌访问特定端点
@jwt_required - 使用 JSON Web 令牌保护 Flask 端点的装饰器。在调用端点之前,用此修饰的任何路由都需要在请求中存在有效的 JWT(除非 optional=True,在这种情况下,没有 JWT 也是有效的)。
查看更多详情flask-jwt-extended
我在 Flask 应用程序中遇到这个错误:
curl http://0.0.0.0:8080/ -H "Authorization: Bearer TGazPL9rf3aIftplCYDTGDc8cbTd"
{
"msg": "Not enough segments"
}
这里有一个示例:
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, '/')
控制台:
* 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 -
我不明白:怎么了?
其他库抛出异常(site-packages/jwt/api_jws.py中第183行):
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')
您尝试传入的令牌 (TGazPL9rf3aIftplCYDTGDc8cbTd
) 不是有效的 JWT。一个有效的 JWT 包含三个由点分隔的部分:<base64_encoded_header>.<base64_encoded_payload>.<signature>
。您可以在这里阅读更多相关信息:https://jwt.io/introduction/
我会 post 在这里回答与我上面的初始问题相关的问题,上下文是我试图让用户 flask_jwt_extend 在 firebase 身份验证中使用,但我有这个 "Not enough segments" 错误,我被阻止了。
所以在那之后,我将我的代码更改为:
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, '/')
检查您的 JWT 令牌。有效吗?
@fresh_jwt_required - fresh_jwt_required() 函数只允许新令牌访问特定端点
@jwt_required - 使用 JSON Web 令牌保护 Flask 端点的装饰器。在调用端点之前,用此修饰的任何路由都需要在请求中存在有效的 JWT(除非 optional=True,在这种情况下,没有 JWT 也是有效的)。
查看更多详情flask-jwt-extended