Перехватчики дротика Grpc

Я разрабатываю приложение флаттера, используя 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 использует неизменяемую карту.

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

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


person Arash    schedule 08.02.2021    source источник


Ответы (1)


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

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

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

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

Во-вторых: как я могу скопировать метаданные из опций, изменить их и использовать измененный объект? Просто клонируйте предыдущие CallOptions с новым значением через 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);
  }
}
person Dukhanov Maxim    schedule 09.02.2021