使用gRPC实施用户身份验证

问题描述

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

所以我的问题如下:

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

我假设在客户端上可以使用元数据,但是有没有一种方法可以为每个呼叫自动添加身份验证数据?

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

解决方法

是否可以为每个呼叫自动添加身份验证数据?

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