Python 在解码承载令牌之前,去除承载前缀的正常方法是什么?

Python 在解码承载令牌之前,去除承载前缀的正常方法是什么?,python,Python,客户端向服务器发送一个承载令牌,如下所示: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 显然,我不需要“承载者”前缀,所以我必须去掉它。我理解这就像拆分字符串并获取正确的元素一样简单,但我不理解的是,为什么我使用的库

客户端向服务器发送一个承载令牌,如下所示:

Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
显然,我不需要“承载者”前缀,所以我必须去掉它。我理解这就像拆分字符串并获取正确的元素一样简单,但我不理解的是,为什么我使用的库函数不能为我做到这一点。 我还必须检查令牌的类型是否正确(在本例中为bearer)。它迫使我写额外的代码行,我不喜欢它

所以我的问题是“有没有更聪明的方式来处理代币?”


我正在使用
PyJWT

承载…
字符串通常位于HTTP请求的
授权
头中。然后,它取决于您用于接收或发送HTTP请求的特定框架(如果有对此类头的特定支持)

该格式不是JSON web令牌标准的一部分;
Authorization
头(带或不带
Bearer
)是一个常见的位置,但是像PyJWT这样的包只处理令牌,而不处理传输机制。因此,一个专注于处理JSON Web标记的库不应该期望处理HTTP头之外的解析标记(尽管有些可能会这样做)

HTTP 1.1规范确定HTTP请求上的头应该是什么样子,它只标准化了a应该包含凭据,而a声明凭据应该至少包含一个方案和任意参数:

credentials = auth-scheme #auth-param
对于PythonHTTP库来说,这并不是什么好事情。特定的RFC只进一步指定了两种不同的授权方案:基本授权方案和摘要授权方案。持票人不是本标准的一部分。因此,像Werkzeug这样的框架(除其他外,它是Flask的基础)确实支持解析
授权
头,但只有在使用这两个标准化方案中的一个时(请参阅)

承载
方案是。它只是定义了客户机可以发送一个令牌,一个给他们的令牌,服务器可以接受该令牌来授权请求。
Bearer
方案只是发送令牌的几种方式之一,对令牌的唯一限制是它应该是base64编码的。什么也没说

但它确实指出,如果使用授权标头,则格式必须:

因此,
Bearer
,后跟1个或多个空格,然后是Base64数据,并添加了一些允许的字符(Base64仅使用字母、数字和
+
以及
/
作为结尾填充,因此
-
在这里是额外的)。就这样

如果您必须有一个库,请找到一个处理OAuth 2.0的库。但在其他方面,只需在空格上拆分,并(可选地)将字符串解码为Base64即可:

from base64 import b64decode

auth = header_string.split(maxsplit=2)  # only interested in the first two parts
token = b64token = None
if len(auth) > 1 and auth.lower() == 'bearer':
    b64token = auth[1]
    try:
        token = b64decode(b64token)
    except ValueError:
        pass
现在,
b64token
token
要么是
None
,要么是
Bearer
之后的第一个非空白部分,以及该字符串的base64解码版本


JSON Web令牌实际上是三个Base64编码的字符串与
连接在一起,因此将此类令牌解码为单个Base64编码值很容易失败。您可以将
b64token
字符串传递给
PyJWT

Bearer…
字符串通常位于HTTP请求的
授权
头中。然后,它取决于您用于接收或发送HTTP请求的特定框架(如果有对此类头的特定支持)

该格式不是JSON web令牌标准的一部分;
Authorization
头(带或不带
Bearer
)是一个常见的位置,但是像PyJWT这样的包只处理令牌,而不处理传输机制。因此,一个专注于处理JSON Web标记的库不应该期望处理HTTP头之外的解析标记(尽管有些可能会这样做)

HTTP 1.1规范确定HTTP请求上的头应该是什么样子,它只标准化了a应该包含凭据,而a声明凭据应该至少包含一个方案和任意参数:

credentials = auth-scheme #auth-param
对于PythonHTTP库来说,这并不是什么好事情。特定的RFC只进一步指定了两种不同的授权方案:基本授权方案和摘要授权方案。持票人不是本标准的一部分。因此,像Werkzeug这样的框架(除其他外,它是Flask的基础)确实支持解析
授权
头,但只有在使用这两个标准化方案中的一个时(请参阅)

承载
方案是。它只是定义了客户机可以发送一个令牌,一个给他们的令牌,服务器可以接受该令牌来授权请求。
Bearer
方案只是发送令牌的几种方式之一,对令牌的唯一限制是它应该是base64编码的。什么也没说

但它确实指出,如果使用授权标头,则格式必须:

因此,
Bearer
,后跟1个或多个空格,然后是Base64数据,并添加了一些允许的字符(Base64仅使用字母、数字和
+
以及
/
作为结尾填充,因此
-
在这里是额外的)。就这样

如果您必须有一个库,请找到一个处理OAuth 2.0的库。但在其他方面,只需在空格上拆分,并(可选地)将字符串解码为Base64即可:

from base64 import b64decode

auth = header_string.split(maxsplit=2)  # only interested in the first two parts
token = b64token = None
if len(auth) > 1 and auth.lower() == 'bearer':
    b64token = auth[1]
    try:
        token = b64decode(b64token)
    except ValueError:
        pass
现在,
b64token
token
要么是
None
,要么是
Bearer
之后的第一个非空白部分,以及该字符串的base64解码版本

JSON Web标记实际上是三个Base64编码的字符串,它们与
连接在一起,因此将这样的标记解码为单个Base64编码的值很容易实现