HTTP-заголовки HTTP-клиента gRPC - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь установить некоторые заголовки HTTP при вызове клиента gRPC, написанном на PHP. Я прочитал всю документацию, которую я могу найти для реализации gRPC в PHP, но не могу найти ничего, определяющего, как это сделать в PHP. Читая документы для других языков, я пришел к выводу, что заголовки указываются в метаданных клиента. Тем не менее, я не могу найти ничего о том, как они должны быть отформатированы в php, и все форматы, которые я пробую, не работают. Вот мой текущий код:

$options = [
  'credentials' => $this->credentialsObject,
  'update_metadata' => function($metaData){
    $metaData['headers'] = ['Authorization' => 'Bearer ' . $this->token];
    return $metaData;
  }
];

$client = new OrganizationServiceClient($this->url,$options);

$r = new \Google\Protobuf\GPBEmpty();
list($data,$status) = $client->list($r)->wait();

Ответ, который я получаю, такой же, как если бы я вообще не устанавливал заголовок авторизации (Access Denied!), хотя мне сказали, что мой пользователь должен иметь разрешение на просмотр этого ресурса.

У меня нет доступа к каким-либо журналам сервера, чтобы помочь с отладкой на этой стороне (хотя я пытаюсь получить доступ к ним - возможно, смогу на следующий день).

Любая помощь или указатели будут оценены. Я работаю над этим уже несколько дней и чувствую, что перепробовал все, что мог придумать.

Спасибо!

1 Ответ

0 голосов
/ 10 сентября 2018

Мне удалось получить информацию, необходимую для решения этой проблемы, задав вопрос в группе Google grpc.io. Вот эта тема: https://groups.google.com/forum/#!searchin/grpc-io/php%7Csort:date/grpc-io/p4-P78_EOyY/pHHR6Q5OBwAJ.

Суть решения заключается в том, что gRPC использует HTTP2 (так отличается синтаксис заголовка) с метаданными, эквивалентными заголовкам. Ниже мой обновленный код. Вот важная строка $metaData['authorization'] = ['Bearer ' . $this->token];. Обратите внимание, что ключ массива $metaData совпадает с ключом заголовка HTTP2, а значение равно массиву , содержащему значение заголовка в виде строки.

$options = [
  'credentials' => $this->credentialsObject,
  'update_metadata' => function($metaData){
     $metaData['authorization'] = ['Bearer ' . $this->token];
     return $metaData;
  }
];

$client = new OrganizationServiceClient($this->url,$options);

$r = new \Google\Protobuf\GPBEmpty();
list($data,$status) = $client->list($r)->wait(); 
...