Я пытаюсь реализовать обмен на LinkedIn в нашем проекте. Это работает для меня как очарование, однако, для всех моих коллег, это не так. Возвращается 401: Unknown authentication scheme
просто для обмена запросами (профильные запросы работают нормально).
Приложение LinkedIn, которое мы используем, принадлежит мне. В целях тестирования другой разработчик попытался создать приложение в своей учетной записи, но проблема осталась: я был единственным, кто мог поделиться.
Мы используем linkedinapi / LinkedIn для бэк-энда. Вот код:
protected function openConnection()
{
$credentials = \Config::get('services.linkedin');
try
{
$this->connection = new \LinkedIn\LinkedIn([
'api_key' => $credentials['client_id'],
'api_secret' => $credentials['client_secret'],
'callback_url' => $credentials['redirect'],
]);
$this->connection->setAccessToken(\Auth::user()->linkedin->token['access_token']);
}
catch (\Exception $e)
{
\Log::error('Failed LinkedIn auth, exception is attached', [$e]);
throw new CouldNotPostException('Please, re-link your LinkedIn account, failed to send your post to LinkedIn.');
}
}
protected function send()
{
$object = [
'content' => [
'title' => $this->post->title,
'description' => \Str::limit($this->post->description, 253),
'submitted-url' => $this->post->shortlink,
'submitted_image_url' => \URL::to($this->post->image),
],
'comment' => $this->content,
'visibility' => [
'code' => 'connections-only'
]
];
try
{
$result = $this->connection->post('/people/~/shares?format=json', $object);
$this->posted($result['updateKey']);
}
catch (\Exception $e)
{
\Log::error('Failed LinkedIn posting, exception is attached', [$e]);
throw new CouldNotPostException('Failed to send your post to LinkedIn, our developers have been notified of this error.');
}
}
UPD: Оказывается, он может публиковать только на моей машине, поэтому что-то не так с конфигурацией на своих машинах. Ищу это.
изучение
Я попросил моего коллегу войти в LinkedIn на моем компьютере, чтобы проверить, не удается ли отправить сообщение для его учетной записи или для его компьютера. Он опубликовал, который показал, что что-то не так с моей конфигурацией, поэтому он работает.
Следующим моим шагом было переустановить все пакеты вендора, включая вышеупомянутые linkedinapi / LinkedIn. После этого пост перестал работать и для меня. После проверки того, как библиотека подписывает запросы, я обнаружил, что она не соответствует тому, как этого требует LinkedIn. Библиотека была в том числе oauth2_access_token
параметр в URL, но LinkedIn ожидает Authorization
Заголовок HTTP, как указано в их документации:
Получив токен доступа, вы можете начать выполнять аутентифицированные запросы API от имени пользователя. Это достигается путем включения заголовка «Авторизация» в ваш HTTP-вызов API LinkedIn.
Решение
Так что пока я изменил способ подачи запроса. Вместо
$result = $this->connection->post('/people/~/shares?format=json', $object);
Я использую другую функцию, которая позволяет мне включать заголовок вручную:
$result = $this->connection->fetch(
'/people/~/shares?format=json',
$object,
\LinkedIn\LinkedIn::HTTP_METHOD_POST,
[ 'Authorization: Bearer ' . $this->connection->getAccessToken() ]
);
Также я создал запрос на извлечение данных в хранилище.
Других решений пока нет …