当前位置: 首页 > 知识库问答 >
问题:

OAuth2.0承载令牌到底是什么?

洪梓
2023-03-14

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

一种具有财产的安全令牌,任何拥有令牌的一方(“持票人”)都可以以任何其他拥有令牌的一方可以使用的任何方式使用该令牌。

对我来说,这个定义是模糊的,我找不到任何规范。

  • 假设我正在实现一个授权提供者,我可以为承载令牌提供任何类型的字符串吗?
  • 它可能是随机字符串吗?
  • 它必须是某些属性的base64编码吗?
    是否应该对它进行哈希?
  • 服务提供程序是否需要查询授权提供程序以验证此令牌?

谢谢你的任何指针。

共有2个答案

狄河
2023-03-14

当我读到你的问题时,我尝试在互联网上搜索不记名令牌是如何加密或签名的,但没有成功。我猜承载令牌没有散列(可能是部分散列,但不是完全散列),因为在这种情况下,将不可能解密它并从中检索用户属性。

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

假设我正在实现一个授权提供者,我可以为承载令牌提供任何类型的字符串吗?会是随机字符串吗?它必须是一些属性的base64编码吗?要不要散列?

所以,我将尝试解释承载令牌和刷新令牌是如何工作的:

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

访问令牌是一个承载令牌,您必须将其添加到所有请求头中,以便作为具体用户进行身份验证。

Authorization: Bearer <access_token>

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

访问令牌的有效期很短(即30分钟)。如果访问令牌有一个很长的过期时间,这将是一个问题,因为理论上不可能撤销它。因此,假设一个用户的role=“admin”更改为“user”。如果用户使用role=“Admin”保留旧令牌,他将能够使用Admin权限访问该令牌直到该令牌到期为止。这就是为什么访问令牌的有效期很短。

但是,有一个问题会在脑海中浮现。如果一个访问令牌的有效期很短,我们必须在短时间内发送用户和密码。这安全吗?不,它不是。我们应该避免。这时出现了刷新令牌来解决这个问题。

刷新令牌存储在DB中,会有很长的过期时间(例如:1个月)。

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

如果用户访问令牌已被破坏,则必须从DB中删除该用户的刷新令牌。这样,令牌将只在访问令牌过期之前有效,因为当黑客试图获得发送刷新令牌的新访问令牌时,此操作将被拒绝。

公西浩
2023-03-14

不记名令牌
一种具有属性的安全令牌,拥有该令牌的任何一方(“不记名”)可以以任何其他拥有该令牌的一方可以使用的任何方式使用该令牌。使用承载令牌并不要求承载人证明拥有加密密钥材料(拥有证明)。

承载令牌是由身份验证服务器为您创建的。当用户对应用程序(客户机)进行身份验证时,身份验证服务器就会为您生成一个令牌。承载令牌是OAuth2.0中使用的主要访问令牌类型。一个承载令牌基本上是说“给予这个令牌的承载访问权”。

承载令牌通常是身份验证服务器创建的某种不透明值。它不是随机的;它是基于向您提供访问权限的用户和您的应用程序获得访问权限的客户端创建的。

例如,为了访问API,您需要使用访问令牌。访问令牌的寿命很短(大约一个小时)。您可以使用承载令牌获取新的访问令牌。为了获得访问令牌,您将此承载令牌连同客户端ID一起发送给身份验证服务器。这样,服务器就知道使用承载令牌的应用程序与为其创建承载令牌的应用程序是同一个应用程序。示例:我不能只是拿着为您的应用程序创建的承载令牌在我的应用程序中使用它,它不会工作,因为它不是为我生成的。

Google刷新令牌如下所示: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

上面示例中的字符串“abcdef123456”是承载授权令牌。这是身份验证服务器生成的加密令牌。所有与操作一起发送的承载令牌都有issue字段,而受众字段将发送方域指定为https://形式的URL。例如,如果电子邮件来自noreply@example.com,则受众是https://example.com。

如果使用承载令牌,请验证请求来自身份验证服务器,并且是针对发件人域的。如果令牌没有验证,服务应该用HTTP响应代码401(未授权)响应请求。

承载令牌是OAuthV2标准的一部分,被许多API广泛采用。

 类似资料:
  • 我正在使用改型2.0在Android上构建一个Bitbucket REST客户端。 就我而言,OAuth2.0提供了“隐式授权”,当用户在提示下登录到他们的帐户时,它立即向客户机提供访问承载令牌。 承载令牌是可用于访问受保护资源的令牌。任何拥有承载令牌的人与其他拥有承载令牌的人一样,都有权访问受保护的资源。(根据IETF的这份文件) 如果我错了,请纠正我,但我认为使用隐式授权,在用户登录到他们的B

  • 在Postman中,我可以使用 回调URL Auth URL 客户端ID 我如何使用C#代码做同样的事情?

  • 在我的Android Wear应用程序中: 我打电话获取我的授权代码: https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/books 然后,我在手机上授权该应用程序。我进行 POST 调用以获取我的令牌(访问权限 https://www.googleapis.com/oauth2/v3/t

  • 假设我们使用OAuth承载令牌来保护API。有一个带有OWIN中间件的NuGet包可以为我们做到这一点:https://www.nuget.org/packages/Microsoft.Owin.Security.OAuth. Everethig看起来很棒,直到提出访问令牌过期的问题——我们不想强迫用户一次又一次地重新登录。据我所知,有三种基本方法: 使访问令牌到期时间非常长(例如1个月) 使用O

  • 我在调用rest api时尝试使用承载令牌时遇到一些问题。 我尝试了两种方法,结果相同: 我在azure门户中创建了一个应用注册,并授予它使用devops api进行用户模拟的权限。 我在中创建了一个应用程序https://app.vsaex.visualstudio.com/并授予it项目/团队管理权限。 对于我的代码,我使用了这个(当我使用PAT进行身份验证时有效) 我使用以下示例获取令牌:h

  • 如何使用Live PayPal ClientID和密钥从PayPal https://api-M.PayPal.com/v1/oauth2/Token API调用中获得访问/承载令牌。 我在调用Postman中的API之前使用了下面的设置 基本Auth类型。主体tab=x-www-form-urlencoded。grant_type=client_credentials 我得到以下响应时调用以上A