首页 > 解决方案 > 使用 gRPC 实现用户身份验证

问题描述

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

所以我的问题如下:

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

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

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

标签: authenticationgrpcgrpc-dart

解决方案


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

您可以在生成的客户端构造函数中提供带有参数的默认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);
    };
  }
}

推荐阅读