【问题标题】:User authorization in Api GatewayApi Gateway 中的用户授权
【发布时间】:2021-05-13 12:46:31
【问题描述】:

我正在尝试了解微服务的架构,并且我有一个关于如何正确授权 Api 网关中的用户或检查其是否存在的问题,如果我有用于注册、登录和令牌颁发的单独用户服务。 假设我有两个服务:一个用于注册、登录和接收令牌的用户服务以及一个订购服务。他们有自己的数据库。

我有猜测:

  1. 对于 api 网关的每个请求,向授权服务发出单独的请求并检查那里的令牌和用户角色,然后才将请求重定向到订单服务。
  2. 为 Api 网关提供用户数据库的访问权限,以验证令牌和用户,然后将请求重定向到订单服务
  3. 结合 Api 网关和用户服务(我认为这是个坏主意)。

还是有更好的猜测?

【问题讨论】:

    标签: c# .net-core authorization microservices api-gateway


    【解决方案1】:

    我认为你有很多方法可以做到这一点。

    我可以告诉您如何使用 AWS 中的无服务器架构来做到这一点(就像我正在做的那样):

    您可以创建服务 (lambdas)、配置 JWT 授权方(API 网关),并将授权方用于您的函数,并可以选择为每个函数定义所需的权限(范围)。无需任何自定义代码即可做到这一点。

    here 你可以看到关于它如何工作的更好解释

    您也可以编写自己的授权函数,用于验证请求。

    附言API Gateway 可以缓存结果,因此无需为每个请求调用您的授权方。

    不知道你是想自己管理基础设施还是使用云提供商的一些服务,但我认为它至少可以为你提供如何设计这种东西的线索。

    【讨论】:

      【解决方案2】:

      我会做一些假设,说你在谈论 JWT 令牌,并且授权是使用 OAuth2 完成的。

      用户认证完成后,中间有一些步骤,用户最终将拥有一个 JWT 令牌。这个 JWT 令牌内部包含 3 个部分,其中之一是签名。此签名是加密的,没有密钥就无法解密,而 JWT 的其余内容是纯文本。令牌的内容与签名一起在授权服务器上使用密钥进行签名。任何拥有密钥的人都可以阅读该消息。此密钥也是识别谁是令牌发行者的一种方式。这样你就可以说你信任这个令牌,因为它是由你信任的人发出的。令牌中的任何更改,如果没有重新加密,将导致令牌无效。令牌还包含授权/特权。

      请注意,提到的“密钥”可能会因加密算法而异。

      基于此,您无需针对数据库用户检查每个请求。

      为了更好地理解,请查看 OAuth2 协议(可能还有 OIDC)。

      还有https://www.taithienbo.com/how-can-you-trust-a-jwt-to-be-authentic/

      【讨论】:

      • 可能你理解错了,比如我们请求创建一个订单,但是我们必须检查传输的用户ID,为此我们需要联系用户服务。此外,每个请求都必须包含一个也需要验证的令牌。
      • @Mccree 您想知道用户是否被您的系统识别,但为此无需针对数据库重新验证它,因为您基于令牌的签名信任它。您可能需要发送请求以获取尚未存储在令牌中的数据。此外,ID 不得以人类可读的形式存储,例如 int。更好地使用 UUID。
      猜你喜欢
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 2019-12-22
      • 2020-09-21
      • 2019-12-28
      • 2017-08-23
      相关资源
      最近更新 更多