【问题标题】:Who issued the bearer token谁发行了不记名令牌
【发布时间】:2019-08-14 14:33:30
【问题描述】:

我的服务器在标头中获得一个不记名令牌,如下所示:Authorization: Bearer <token>。现在我需要验证该令牌,为此,我需要谁颁发该令牌。例如,Google 令牌需要我使用 Google API 对其进行验证,而 Facebook 颁发的令牌需要我使用 Facebook API 对其进行验证。

那么我怎样才能知道令牌的来源呢?也许我需要标题中的另一个字段来指定它的来源?

【问题讨论】:

    标签: authentication oauth-2.0 jwt


    【解决方案1】:

    由于您使用多个授权提供程序,我猜您不使用profile 以外的范围(获取用户身份)。因此,我认为您可以使用自己的 OAuth2 服务器,该服务器支持使用外部提供商(Google、Facebook)进行身份验证。然后,您的应用程序将仅处理由您的 OAuth2 服务器发出的访问令牌,该令牌还将保留有关用户身份的信息。此解决方案还有一个额外的好处,即您可以支持没有社交网络帐户的用户 - 他们会在您的 OAuth2 服务器上创建一个新帐户。

    另一种解决方案可能不太优雅,但更容易实现。创建一个规则,在使用访问令牌之前,客户端必须在某个新端点注册令牌,并提供有关令牌颁发者(Google、Facebook ...)的信息。然后您可以保留有关谁发行了哪个令牌的信息。此时,在验证访问令牌之后,您还可以考虑将令牌替换为会话 cookie,该会话 cookie 稍后将用于访问您的 API,而不是访问令牌。这个解决方案是有状态的,这使得它更难扩展,但使用 cookie 可能会使客户端更容易实现(不需要刷新令牌)。

    正如您所写,您还可以要求提供有关谁发行令牌的额外信息。您可以为其使用自定义 HTTP 标头或令牌前缀。它很容易实现,并且不会向您的后端引入状态。

    也许还有更多的解决方案。您可以根据自己的需要选择一款。

    【讨论】:

    • 是的,从中期来看,我将使用自己的 OAuth2 服务器(或 openId 服务器),我一定会实施您提出的解决方案。目前,我认为标题方法是最好的。
    【解决方案2】:

    如果您的意思是Authorization: Bearer <token>RFC6750 定义的承载令牌用法,那么需要考虑的选项很少。

    如果令牌(在标头中发送的令牌)是 JSON Web 令牌 (JWT),那么您的 API 可以验证 JWT 中的颁发者参数以识别颁发者。要使用这种方法,请求发送客户端需要获取 JWT 访问令牌。与不同的提供商核实此功能。

    如果第一个选项失败,那么您将不得不使用自定义标头来传达颁发者的详细信息。根据定义(使用 JWT 时除外)访问令牌是不透明的,因此您的 API 无法通过查看它来派生颁发者。因此,您的客户需要传达发行人的详细信息。

    第三种选择是在允许他们使用您的 API 之前进行客户端注册。注册后,您可以向他们颁发一个标识符,您可以映射访问令牌颁发者。当客户端发出请求时,您可以要求他们通过例如标头来传达客户端信息。这样,您就可以限制任何可以获得访问令牌的人使用您的 API 的能力。

    【讨论】:

      猜你喜欢
      • 2016-11-20
      • 2018-06-21
      • 1970-01-01
      • 2017-04-20
      • 2018-10-10
      • 1970-01-01
      • 2022-08-15
      • 2021-08-05
      • 2017-10-27
      相关资源
      最近更新 更多