可以在服务之间传递 OAuth 访问令牌吗?
Is it OK to pass on OAuth Access Token between services?
在 SSO/OAuth/microservices 的上下文中考虑以下场景:
- 用户使用 OAuth 的隐式流程成功登录到 Web 应用程序。
- Web 应用程序从 服务 A 和 服务 B 请求一些数据,传递用户的访问令牌以授权这两个请求。
- 服务 A 还调用 服务 B(传递相同的访问令牌!)以构建对初始 Web 应用程序的响应要求。
现在,可以将用户的访问令牌从 服务 A 传递到 服务 B 吗?
或者 服务 A 是否应该使用 "Client Credentials" 授予来获取其自己的访问令牌以授权对 服务 B 的调用?
更新:
请假设这两个服务都属于同一个组织,并且都信任同一个授权服务器。此外,这两种服务都位于同一 API 验证访问令牌的网关之后。
我的看法是,如果您有 2 个不同的服务信任同一个 IDP(STS),那么您可以让服务 A 请求令牌,然后您可以将相同的令牌传递给服务 B 并让服务 B 进行验证再次令牌。可以传递令牌,因为您不希望用户再次登录以进行另一个服务调用。
此外,这取决于您设置服务的方式。如果服务 A 需要来自服务 B 的一些数据来将数据返回给用户,那么我们应该传递相同的用户令牌。我不认为服务应该有他们的访问令牌。
使用用户令牌确实有助于识别每个服务级别的声明和数据访问。因此,最好传递用户令牌并让每个服务在将数据发送给用户之前验证令牌。
这取决于谁在控制 Web 应用程序、服务 A 和服务 B。如果它们都是 运行 由同一方提供,则传递令牌没有问题,因为它处于同一安全范围内域名。
但是如果服务 B 由第 3 方 运行 然后事情变得有问题,因为服务 B 的管理员可以获取访问令牌并调用服务 A,就好像它是您的 Web 应用程序一样,可能会访问它不应该访问的资源到.
您还会注意到,如果服务 A 和服务 B 由除您之外的 2 个不同方所有,您的 Web 应用程序还应分别获取两个不同的访问令牌以调用服务 A 和服务 B 以防止相同安全问题。
所以答案确实是:这取决于谁在控制什么,即令牌是否跨越 administrative/security 域。
我找到了以下 3 个选项:
如果每个微服务都在验证令牌,那么我们可以传递相同的令牌。但问题是 - 在相同令牌之间可能会过期。
如果我们使用 client_credentials grant 那么我们有两个问题:一个是,我们需要在下一个微服务中发送 username/id。另一个是,我们需要请求两次 - 第一次是获取访问令牌,第二次是实际调用。
如果我们只在 API 网关中(而不是在微服务中)进行令牌验证,那么我们需要从 API 网关在每个微服务中发送用户名。并且需要更改微服务实现以接受 param/header.
在 SSO/OAuth/microservices 的上下文中考虑以下场景:
- 用户使用 OAuth 的隐式流程成功登录到 Web 应用程序。
- Web 应用程序从 服务 A 和 服务 B 请求一些数据,传递用户的访问令牌以授权这两个请求。
- 服务 A 还调用 服务 B(传递相同的访问令牌!)以构建对初始 Web 应用程序的响应要求。
现在,可以将用户的访问令牌从 服务 A 传递到 服务 B 吗?
或者 服务 A 是否应该使用 "Client Credentials" 授予来获取其自己的访问令牌以授权对 服务 B 的调用?
更新:
请假设这两个服务都属于同一个组织,并且都信任同一个授权服务器。此外,这两种服务都位于同一 API 验证访问令牌的网关之后。
我的看法是,如果您有 2 个不同的服务信任同一个 IDP(STS),那么您可以让服务 A 请求令牌,然后您可以将相同的令牌传递给服务 B 并让服务 B 进行验证再次令牌。可以传递令牌,因为您不希望用户再次登录以进行另一个服务调用。
此外,这取决于您设置服务的方式。如果服务 A 需要来自服务 B 的一些数据来将数据返回给用户,那么我们应该传递相同的用户令牌。我不认为服务应该有他们的访问令牌。
使用用户令牌确实有助于识别每个服务级别的声明和数据访问。因此,最好传递用户令牌并让每个服务在将数据发送给用户之前验证令牌。
这取决于谁在控制 Web 应用程序、服务 A 和服务 B。如果它们都是 运行 由同一方提供,则传递令牌没有问题,因为它处于同一安全范围内域名。
但是如果服务 B 由第 3 方 运行 然后事情变得有问题,因为服务 B 的管理员可以获取访问令牌并调用服务 A,就好像它是您的 Web 应用程序一样,可能会访问它不应该访问的资源到.
您还会注意到,如果服务 A 和服务 B 由除您之外的 2 个不同方所有,您的 Web 应用程序还应分别获取两个不同的访问令牌以调用服务 A 和服务 B 以防止相同安全问题。
所以答案确实是:这取决于谁在控制什么,即令牌是否跨越 administrative/security 域。
我找到了以下 3 个选项:
如果每个微服务都在验证令牌,那么我们可以传递相同的令牌。但问题是 - 在相同令牌之间可能会过期。
如果我们使用 client_credentials grant 那么我们有两个问题:一个是,我们需要在下一个微服务中发送 username/id。另一个是,我们需要请求两次 - 第一次是获取访问令牌,第二次是实际调用。
如果我们只在 API 网关中(而不是在微服务中)进行令牌验证,那么我们需要从 API 网关在每个微服务中发送用户名。并且需要更改微服务实现以接受 param/header.