问题描述
我希望通过 dart gRPC服务器+客户端实施简单的用户身份验证,并且正在努力寻找有关如何正确实现此目的的示例。
所以我的问题如下:
我假设在客户端上可以使用元数据,但是有没有一种方法可以为每个呼叫自动添加身份验证数据?
对于服务器,我假设要使用拦截器,但是如何仅为特定服务指定拦截器(因为并非所有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);
};
}
}