【问题标题】:Implement user authentication with gRPC使用 gRPC 实现用户身份验证
【发布时间】:2021-01-22 14:45:50
【问题描述】:

我希望使用我的 dart gRPC 服务器 + 客户端实现简单的用户身份验证,并且正在努力寻找有关如何正确实现此目的的示例。

所以我的问题如下:

  1. 如何将用户身份验证数据 (JWT) 添加到需要在客户端进行身份验证的 API 调用?
  2. 如何在服务器上处理这些数据?

我假设在客户端,元数据是要走的路,但有没有办法为每次调用自动添加身份验证数据?

对于服务器,我假设拦截器是要走的路,但是如何只为特定服务指定拦截器(因为并非所有 API 调用都需要身份验证)?

【问题讨论】:

    标签: authentication grpc grpc-dart


    【解决方案1】:

    有没有办法为每次通话自动添加身份验证数据?

    您可以在生成的客户端构造函数中提供带有options 参数的默认CallOptions。 您可以使用它为所有呼叫添加授权信息。如果您需要为每个调用执行异步工作(例如,检查令牌是否仍然有效并可选择刷新它),您可以添加一个 MetadataProvider,它会为每个调用调用。

    如何仅为特定服务指定拦截器(因为并非所有 API 调用都需要身份验证)?

    拦截器可以访问ServiceMethod,其中包含一个名称。因此,您可以检查是否仅在某些方法上调用拦截器:

    extension OnlyInterceptSome on Interceptor {
      Interceptor limitTo(Set<String> endpoints) {
        return (call, method) {
          // Skip the check if we don't care about the method.
          if (!endpoints.contains(method.name)) return null;
    
          // Invoke the regular interceptor otherwise
          return this(call, method);
        };
      }
    }
    

    【讨论】:

    • 好的。那正是我所想。客户端正是我所考虑的。不过,我不喜欢服务器端的是,它很容易忘记当时未经授权的方法。当然,我可以做相反的事情,并有一个“未经授权”的列表,但这很快就会变得无聊。如果两个不同服务的两个方法具有相同的名称,这也是一个问题。
    • 如果您希望服务默认获得授权,我看不出拥有“未授权”列表有什么坏处。而且由于必须将拦截器单独添加到服务中,我认为这不会成为问题。
    • 好吧,我的问题是拦截器没有添加到服务中,而是添加到服务器中。因此,我将创建的所有服务都必须添加到“未授权”列表中,这将是大多数调用。如果有一种方法可以将拦截器添加到服务中,那么我会 100% 使用这种方法。
    • 或者您知道有什么方法可以在服务上设置拦截器?
    猜你喜欢
    • 1970-01-01
    • 2020-06-02
    • 2018-04-30
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多