是否可以在服务之间传递OAuth访问令牌?

时间:2016-10-03 20:28:57

标签: oauth oauth-2.0 authorization access-token microservices

在SSO / OAuth /微服务的上下文中考虑以下场景:

  1. 用户使用OAuth的隐式流程成功登录Web应用程序。
  2. 网络应用会从服务A 服务B 请求一些数据传递用户的访问令牌以授权这两个请求。
  3. 服务A 还会调用服务B (传递相同的访问令牌!),以便构建对初始Web App请求的响应。
  4. 现在,可以将用户的访问令牌从服务A 传递到服务B 吗?

    服务A 使用"客户端凭证"授予获取自己的访问令牌以授权调用服务B

    更新
    请假设两个服务都归同一个组织所有,并且都信任同一个授权服务器。此外,这两个服务都位于验证访问令牌的相同API网关之后。

3 个答案:

答案 0 :(得分:3)

这取决于谁控制Web应用程序,服务A和服务B.如果它们全部由同一方运行,则传递令牌没有问题,因为它保持在同一安全域内。

但是,例如服务B由第三方运营,然后事情就会出现问题,因为服务B的管理员可以提取访问令牌并将服务A称为您的Web应用程序,可能会访问它本不应该访问的资源。

您还会注意到,如果服务A和服务B由除您之外的2个不同方拥有,您的Web应用程序还应分别获得两个不同的访问令牌,用于呼叫服务A和服务B以防止出现相同的安全问题

所以答案确实是:它取决于谁控制了什么,即令牌是否越过管理/安全域。

答案 1 :(得分:1)

我看到这一点的方式是,如果您有2个不同的服务信任相同的IDP(STS),那么您可以让服务A请求令牌,然后您可以将相同的令牌传递给服务B并让服务B验证令牌再次。可以传递令牌,因为您不希望用户再次登录以进行其他服务调用。

此外,这取决于您设置服务的方式。如果服务A需要来自服务B的一些数据来向用户提供数据,那么我们应该传递相同的用户令牌。我不认为服务应该有他们的访问令牌。

使用用户令牌确实有助于识别每个服务级别的声明和数据访问。因此,最好传递用户令牌,让每个服务在将数据发送给用户之前验证令牌。

答案 2 :(得分:0)

我找到了以下3个选项:

  • 如果每个微服务都在验证令牌,那么我们可以传递相同的令牌。但问题是 - 在同一令牌之间可以过期。

  • 如果我们使用client_credentials grant那么我们就有两个问题:一个是,我们需要在下一个微服务中发送用户名/ id。另一个是,我们需要两次请求 - 首先是获取访问令牌,然后是实际呼叫。

  • 如果我们只在API网关中进行令牌验证(不在微服务中),那么从API网关我们需要在每个微服务中发送用户名。并且需要更改微服务实现以接受该参数/标题。