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编码的值很容易实现