什么是OAuth 2.0承载令牌?

Ale*_*pré 138 oauth bearer-token

根据RFC6750- OAuth 2.0授权框架:承载令牌使用,承载令牌是:

具有属性的安全令牌,即拥有该令牌的任何一方("持票人")可以以任何其他拥有该令牌的方式使用该令牌.

对我来说,这个定义含糊不清,我找不到任何规范.

  • 假设我正在实现授权提供程序,我可以为持有者令牌提供任何类型的字符串吗?
  • 它可以是随机字符串吗?
  • 它必须是某些属性的base64编码吗?
    它应该散列吗?
  • 服务提供商是否需要查询授权提供程序才能验证此令牌?

谢谢你的指针.

DaI*_*mTo 117

承载令牌(Bearer Token)
一种安全令牌,其属性是拥有该令牌的任何一方("持票人")可以以任何其他拥有该令牌的方式使用该令牌.使用不记名令牌不需要持票人来证明拥有加密密钥材料(占有证明).

身份验证服务器为您创建了承载令牌或刷新令牌.当用户对您的应用程序(客户端)进行身份验证时,身份验证服务器会为您生成一个承载令牌(刷新令牌),然后您可以使用该令牌来获取访问令牌.

承载令牌通常是由认证服务器创建的某种秘密值.它不是随机的; 它是根据用户提供访问权限和应用程序访问的客户端创建的.

例如,要访问API,您需要使用访问令牌.访问令牌是短暂的(约一小时).您使用承载令牌获取新的Access令牌.要获取访问令牌,您需要向身份验证服务器发送此承载令牌以及您的客户端ID.这样,服务器知道使用承载令牌的应用程序是与为其创建承载令牌的应用程序相同的应用程序.示例:我不能只为您的应用程序创建一个持有者令牌,并将其与我的应用程序一起使用它不会工作,因为它不是为我生成的.

谷歌刷新令牌看起来是这样的:1/mZ1edKKACtPAb7zGlwSzvs72PvhAbGmB8K1ZrGxpcNM

从评论中复制:我认为您提供的持有人令牌没有任何限制.我唯一能想到的是允许不止一个的好处.例如,用户可以对应用程序进行多达30次的身份验证,旧的承载令牌仍然有效.哦,如果一个人没有被用于说6个月,我会从你的系统中删除它.这是您的身份验证服务器,必须生成它们并验证它们,以便它的格式取决于您.

更新:

在每个内联操作HTTP请求的授权头中设置承载令牌.例如:

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
Run Code Online (Sandbox Code Playgroud)

上例中的字符串"AbCdEf123456"是承载授权令牌.这是由身份验证服务器生成的加密令牌.通过操作发送的所有承载令牌都具有问题字段,受众字段将发件人域指定为https://形式的URL.例如,如果电子邮件来自noreply@example.com,则受众是https://example.com.

如果使用承载令牌,请验证请求是否来自身份验证服务器并且是否适用于发件人域.如果令牌未验证,则服务应使用HTTP响应代码401(未授权)响应该请求.

承载令牌是OAuth V2标准的一部分,并被许多API广泛采用.

  • 持票人令牌并不意味着它是一个刷新令牌@AqeelSmith https://tools.ietf.org/html/rfc6750#section-6.1.1 (11认同)
  • 第一段暗示承载令牌是刷新令牌,而不是访问令牌。不是这种情况。来自承载令牌规范“该规范描述了当OAuth访问令牌是承载令牌时如何发出受保护的资源请求。” [RFC6750](https://tools.ietf.org/html/rfc6750) (7认同)
  • 阅读答案后,我还认为承载令牌和刷新令牌相同。答案应该更新以澄清这一点。 (7认同)
  • 这个答案非常具有误导性。正如该答案的最初陈述所述,不记名令牌不是刷新令牌。请改正。 (5认同)
  • @ Xavier Egea Bearer令牌基本上是您的刷新令牌,而不是访问令牌. (2认同)
  • 访问令牌的生命周期较短,而刷新令牌的有效期相对较长。我们使用访问令牌来访问服务器端的任何资源,但是当访问令牌过期时,我们使用刷新令牌生成新的访问令牌,以便您不必每次访问令牌过期时都提供密码。但是当刷新令牌过期时,您必须提供您的用户名和密码,但这段时间足够长,比如一个月。 (2认同)
  • @think01 完成。五年的时间对你对某件事的理解有多大的改变。 (2认同)

Xav*_*gea 54

在我阅读你的问题时,我试图在互联网上搜索Bearer令牌是如何加密或签名的,但没有成功.我想承载令牌不是哈希(可能部分,但不完全),因为在这种情况下,将无法解密它并从中检索用户属性.

但你的问题似乎是试图找到有关承载令牌功能的答案:

假设我正在实现授权提供程序,我可以为持有者令牌提供任何类型的字符串吗?它可以是随机字符串吗?它必须是某些属性的base64编码吗?它应该散列吗?

因此,我将尝试解释Bearer令牌和刷新令牌的工作原理:

当用户向服务器请求通过SSL发送用户和密码的令牌时,服务器返回两件事:访问令牌刷新令牌.

访问令牌是一个承载令牌,您必须在所有请求头中添加这些令牌以作为具体用户进行身份验证.

Authorization: Bearer <access_token>
Run Code Online (Sandbox Code Playgroud)

访问令牌是一个加密字符串,包含您希望的所有用户属性,声明和角色.(如果添加更多角色或声明,您可以检查令牌的大小是否增加).一旦资源服务器收到一个acccess令牌,它就能解密它并读取这些用户属性.这样,将在所有应用程序中验证和授予用户.

访问令牌的到期时间很短(即30分钟).如果访问令牌有很长的到期时间,那将是一个问题,因为理论上没有可能撤销它.因此,假设一个角色="Admin"的用户更改为"User".如果用户使用role ="Admin"保留旧令牌,则他将能够使用管理员权限访问令牌到期.这就是访问令牌过期时间短的原因.

但是,有一个问题可以考虑.如果访问令牌的到期时间很短,我们必须每隔短期发送一次用户和密码.这样安全吗?不,不是.我们应该避免它.那时刷新令牌似乎解决了这个问题.

刷新令牌存储在数据库中,并且有很长的到期时间(例如:1个月).

用户可以使用刷新令牌获取新的访问令牌(当它到期时,例如每30分钟),用户在第一次令牌请求中收到该令牌.当访问令牌到期时,客户端必须发送刷新令牌.如果此刷新令牌存在于DB中,则服务器将向客户端返回新的访问令牌和另一个刷新令牌(并将用新刷新令牌替换旧的刷新令牌).

如果用户访问令牌已被泄露,则必须从DB中删除该用户的刷新令牌.这样,令牌只有在访问令牌到期时才有效,因为当黑客试图获取发送刷新令牌的新访问令牌时,此操作将被拒绝.

  • 我不明白这一部分:“一旦授权服务器收到访问令牌,它将能够对其进行解密并读取这些用户属性。这样,用户将在所有应用程序中得到验证和授权”。授权服务器不是授予访问令牌而不是接收它的服务器吗?我正在尝试解决这个问题,许多示例明确区分了授权服务器和资源服务器。我所了解的是,您从授权服务器获取访问令牌,然后将其与您向资源服务器发出的每个请求一起传递? (3认同)

And*_*son 12

请先阅读rfc6749 sec 7.1中的示例。

不记名令牌是一种访问令牌,不需要 PoP(拥有证明)机制。

PoP 意味着一种多因素身份验证,以使访问令牌更加安全。参考

所有权证明是指降低安全令牌被攻击者窃取和使用风险的加密方法。与“不记名令牌”相比,攻击者只需拥有安全令牌就可以使用它,而 PoP 安全令牌则不能如此轻松地使用 -攻击者必须拥有令牌本身并有权访问与令牌关联的某些密钥(这就是为什么它们有时被称为“密钥持有者”(HoK)代币)。

也许事实并非如此,但我想说,

  • 访问令牌=支付方式
  • 不记名代币 = 现金
  • 具有PoP机制的访问令牌,例如MAC令牌=信用卡(将验证签名或密码,有时需要出示您的ID以匹配卡上的姓名)

关于“承载者”一词

“不记名支票(支票)”是指不记名、不背书的支票。任何实际拥有支票的人都可以兑现或存入支票,因为它不需要任何特定的身份识别或授权。而“姓名支票”也称为订单支票,是指专门支付给指定个人或组织的支票。为了兑现或存入姓名支票,收款人必须出示适当的身份证明,并在支票背面签名以背书。收款人的背书作为银行处理支票并将资金转移给指定个人或组织的授权。


小智 7

不记名代币就像一张纸币,例如 100 美元的钞票。人们可以使用纸币而无需被询问任何/许多问题。

持有者令牌 一种安全令牌,其属性是拥有该令牌的任何一方(“持有者”)都可以以任何其他拥有该令牌的方可以使用的方式使用该令牌。使用不记名令牌不需要持有者证明拥有加密密钥材料(拥有证明)。


mon*_*mon 5

不记名令牌是字母,数字,“-”,“”的一个或多个重复。,“ _”,“〜”,“ +”,“ /”,后跟0个或多个“ =”。

RFC 6750 2.1。授权请求标头字段(格式为ABNF(增强BNF))

The syntax for Bearer credentials is as follows:

     b64token    = 1*( ALPHA / DIGIT /
                       "-" / "." / "_" / "~" / "+" / "/" ) *"="
     credentials = "Bearer" 1*SP b64token
Run Code Online (Sandbox Code Playgroud)

看起来像Base64,但是根据标头中的令牌应该使用base64编码吗?, 它不是。

深入研究“ HTTP / 1.1,第7部分:身份验证” **,但是,我看到b64token只是一个ABNF语法定义,允许通常在base64,base64url等中使用的字符。因此,b64token不定义任何编码或解码,而只是定义可以在包含访问令牌的Authorization标头中使用哪些字符。

参考文献

  • 您根本没有解释不记名令牌的用途。 (2认同)
  • 这是迄今为止最好、最明确的答案。如果你看一下 OP 问题,它至少回答了 4 个要点中的 3 个(如果不是全部 4 个的话)。OP 问题不是关于目的,而是关于令牌的内容以及(列表中的第 4 项)是否需要待验证。 (2认同)
  • @JaimeHablutzel,请阅读问题(原始问题中的 4 个要点)。四项中哪一项要求“不记名令牌的用途”?我提供了要点 1 至 3 的答案。也请参阅 Oliver 上面的评论,并请重点关注“回答问题”。 (2认同)