Перехватчики dart Grpc

#flutter #dart #grpc #grpc-dart

#флаттер #dart #grpc #grpc-dart

Вопрос:

Я разрабатываю приложение flutter, использующее Grpc для подключения к серверу. Некоторым службам требуются дополнительные метаданные для аутентификации, поэтому первое, что приходит мне в голову, — это внедрение перехватчика для добавления метаданных к этим запросам, подобным этому:

 class MyClientInterceptor implements ClientInterceptor {

  @override
  ResponseFuture<R> interceptUnary<Q, R>(ClientMethod<Q, R> method, Q request, CallOptions options, invoker) {

    var newOptions = CallOptions.from([options])
      ..metadata.putIfAbsent('token', () => 'Some-Token');
    return invoker(method, request, newOptions);
  }
}
 

Но я понимаю Caught error: Unsupported operation: Cannot modify unmodifiable map , потому что CallOptions использует неизменяемую карту.

Первый вопрос: какова наилучшая практика добавления аутентификации к некоторым запросам вместо создания заглушки клиента с этими метаданными?

Второй: как я могу скопировать метаданные из параметров, изменить их и использовать измененный объект?

Ответ №1:

Первый вопрос: какова наилучшая практика добавления аутентификации к некоторым запросам вместо создания заглушки клиента с этими метаданными?

Некоторые библиотеки АУТЕНТИФИКАЦИИ, которые я видел, используют метаданные для предоставления токена / ключа аутентификации и т. Д. Например https://github.com/grpc/grpc-dart/blob/master/lib/src/auth/auth.dart#L43

Поэтому не стесняйтесь добавлять свой пользовательский заголовок аутентификации в метаданные dict. Это можно сделать через перехватчик, как вы делали, или через CallOptions:

 final resp = await _grpcClient.someApiCall(req,
          options: CallOptions(metadata: {'auth': 'your token'}));
 

Второй: как я могу скопировать метаданные из параметров, изменить их и использовать измененный объект?
Просто клонируйте предыдущие варианты вызовов с новым значением через mergedWith

Второй вопрос:

 
class MyClientInterceptor implements ClientInterceptor {

  @override
  ResponseFuture<R> interceptUnary<Q, R>(ClientMethod<Q, R> method, Q request, CallOptions options, invoker) {

    var newOptions = options.mergedWith(
       CallOptions(
        metadata: <String, String>{
          'token': 'Some-Token',
        }
       )
    );
      
    return invoker(method, request, newOptions);
  }
}