对我来说,此定义含糊不清,我找不到任何规范。 - 假设我正在实现授权提供程序,我可以为持有人令牌提供任何类型的字符串吗? - 它可以是随机字符串吗? - 必须是某些属性的base64编码吗? 应该散列吗? - 服务提供商是否需要查询授权提供程序才能验证此令牌?
Bearer Token
拥有此令牌(“持有者”)的任何一方都可以以任何其他拥有者能够使用的方式使用该令牌。使用Bearer Token不需要持有者证明密钥材料的所有权(即proof-of-possession)。
认证服务器会为您创建Bearer Token。当用户验证应用程序(客户端)时,认证服务器会生成一个Token给您。Bearer Token是OAuth 2.0中最常用的访问令牌类型。Bearer token基本上是说“给予此令牌的持有者访问权限”。
Bearer Token通常是认证服务器创建的某种不透明值。它并不是随机的; 它是基于允许您访问的用户和您的应用程序获得访问而创建的。
为了访问API,您需要使用Access Token。Access Token的寿命较短(大约为一小时)。您使用Bearer Token来获取新的Access Token。要获取Access Token,您需要将此Bearer Token与您的客户端ID一起发送到认证服务器。这样,服务器就知道使用Bearer Token的应用程序与创建Bearer Token的应用程序相同。例如:我不能只是拿您的应用程序创建的Bearer Token并将其与我的应用程序一起使用,因为它不是为我生成的。
Google Refresh token 看起来像这样:1/mZ1edKKACtPAb7zGlwSzvs72PvhAbGmB8K1ZrGxpcNM
从评论中复制:我认为没有任何限制您提供的Bearer Tokens。我所能想到的唯一一件事情就是允许使用多个Bearer Token。例如,用户可以对应用程序进行最多30次身份验证,旧的Bearer Token仍将起作用。但如果有一个Bearer Token在6个月内未被使用,则应将其从系统中删除。它是您的认证服务器将需要生成并验证它们,所以格式由您决定。
更新:
Bearer Token设置在每个Inline Action HTTP请求的Authorization头中。例如:
POST /rsvp?eventId=123 HTTP/1.1
Host: events-organizer.com
Authorization: Bearer AbCdEf123456
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/1.0 (KHTML, like Gecko; Gmail Actions)
rsvpStatus=YES
在上面的示例中,字符串"AbCdEf123456"
是承载授权令牌。这是认证服务器生成的加密令牌。所有随操作发送的承载令牌都具有“issue”字段,其中“Audience”字段指定URL形式为https://的发件人域。例如,如果电子邮件来自noreply@example.com,则受众是https://example.com。Authorization: Bearer <access_token>
访问令牌是一个加密的字符串,包含所有您希望拥有的用户属性、声明和角色。(如果您增加更多的角色或声明,可以检查令牌大小是否增加)。一旦资源服务器接收到访问令牌,它就能够解密并读取这些用户属性。这样,用户将得到验证,并获得所有应用程序授权。
访问令牌具有短暂的过期时间(例如30分钟)。如果访问令牌具有长时间的过期时间,那么可能会出现问题,因为理论上没有撤销的可能性。因此,想象一下一个具有角色="管理员"的用户变成了"用户"。如果用户保留具有角色="管理员"的旧令牌,他将能够在令牌到期前以管理员权限访问。这就是访问令牌具有短暂过期时间的原因。
但是,一个问题出现了。如果访问令牌具有短暂的过期时间,我们必须每个短时间段发送一次用户和密码。这是安全的吗?不是的,我们应该避免这种情况。这时刷新令牌就出现了,以解决这个问题。
刷新令牌存储在数据库中,并且具有长时间的过期时间(例如:1个月)。
用户可以使用刷新令牌获取新的访问令牌(例如每30分钟过期一次),该令牌是在第一次请求令牌时接收到的。当访问令牌过期时,客户端必须发送一个刷新令牌。如果此刷新令牌存在于数据库中,则服务器将向客户端返回一个新的访问令牌和另一个刷新令牌(并将旧的刷新令牌替换为新的)。
如果用户的访问令牌已被盗用,则必须从数据库中删除该用户的刷新令牌。这样,令牌将只在访问令牌到期前有效,因为当黑客尝试发送刷新令牌以获取新的访问令牌时,此操作将被拒绝。
请先阅读rfc6749 sec 7.1中的示例。
持有令牌是一种访问令牌,不需要PoP(拥有证明)机制。
PoP是一种多因素认证,可以使访问令牌更安全。ref
拥有证明是指用于减轻安全令牌被盗用并被攻击者使用的风险的加密方法。与"持有者令牌"不同,仅拥有安全令牌允许攻击者使用它,而拥有证明安全令牌则不那么容易使用 - 攻击者必须同时拥有令牌本身和与令牌相关的某个密钥的访问权限(这就是为什么它们有时被称为"持有者密钥"(HoK)令牌)。
也许情况并非如此,但我想说:
关于"Bearer"这个术语
"Bearer check(支票)"是指一种未命名或未背书的支票。任何实际持有该支票的人都可以兑现或存款,因为它不需要任何特定的身份验证或授权。而"Name check(命名支票)"也被称为定单支票,是特别开给具体个人或组织的支票。要兑现或存入一个命名支票,收款人必须出示适当的身份证明,并在支票背面签字背书。收款人的背书作为银行处理支票并将资金转移给所命名个人或组织的授权。
Bearer token是一个或多个字母、数字、"-"、"."、"_"、"~"、"+"、"/"的重复,后面跟着0个或多个"="。
RFC 6750 2.1. Authorization Request Header Field (格式为ABNF(增强型BNF))
The syntax for Bearer credentials is as follows:
b64token = 1*( ALPHA / DIGIT /
"-" / "." / "_" / "~" / "+" / "/" ) *"="
credentials = "Bearer" 1*SP b64token
看起来像是Base64,但根据头部的令牌是否应该被Base64编码?,它不是。
然而,深入研究一下“HTTP/1.1,第7部分:身份验证”,我发现b64token只是一个ABNF语法定义,允许使用通常用于base64、base64url等的字符。因此,b64token并没有定义任何编码或解码,而是只定义了可以在Authorization头部中包含访问令牌的那部分中使用哪些字符。
这完全回答了OP问题列表中的前3个项目。因此,我扩展了这个答案来回答第4个问题,关于令牌是否必须进行验证的问题,所以@mon可以自由删除或编辑:
授权者负责接受或拒绝HTTP请求。如果授权者表示令牌有效,则由您决定这意味着什么:
1*SP
是指 1个空格
吗?我花了30多分钟才明白。 - byxor一个承载令牌就像一张货币票据,例如100美元的钞票。人们可以在不被问任何/许多问题的情况下使用这张货币票据。
承载令牌
一种安全令牌,其特性是凭借该令牌(即“持有者”)的任何一方都可以以其他任何持有者可能采取的方式使用该令牌。使用承载令牌不需要持有者证明拥有加密密钥材料(即无需证明持有)。
https://datatracker.ietf.org/doc/html/rfc6750#section-5.2
虽然令牌每次发放可以是随机的,但缺点是服务器端需要跟踪令牌数据(例如过期时间)。JSON Web Token (JWT) 通常用作承载令牌,因为服务器可以根据令牌内部内容做出决策。
JWT: https://jwt.io/