Я работаю с linkedin API. Я следовал инструкциям, данным на https://developer.linkedin.com/docs/oauth2 — поэтому я получил код и обменял его на токен доступа. Все хорошо.
Теперь, когда я пытаюсь нажать API, например, чтобы опубликовать обновление, «Шаг 4 — Создание аутентифицированных запросов», я всегда получаю сообщение об ошибке, возвращающее API, говорящее о том, что мой токен доступа недействителен.
Мои параметры заголовка, отправленные в API:
array(5) {
[0]=>
string(22) "Connection: Keep-Alive"[1]=>
string(137) "Authorization: Bearer AQS888888888888888888888888888888-Ab2HY"[2]=>
string(30) "Content-Type: application/json"[3]=>
string(17) "x-li-format: json"[4]=>
string(19) "Content-Length: 171"}
Ответ API всегда дает мне это:
string(134) "{
"errorCode": 0,
"message": "Invalid access token.",
"requestId": "IRBXBZ1X5V",
"status": 401,
"timestamp": 1468498680913
}"
Мой отладчик из curl_getinfo()
возвращает эти данные:
array(22) {
["url"]=>
string(29) "https://api.linkedin.com/v1/?"["content_type"]=>
string(30) "application/json;charset=UTF-8"["http_code"]=>
int(401)
["header_size"]=>
int(495)
["request_size"]=>
int(466)
["filetime"]=>
int(-1)
["ssl_verify_result"]=>
int(0)
["redirect_count"]=>
int(0)
["total_time"]=>
float(0.275796)
["namelookup_time"]=>
float(0.003589)
["connect_time"]=>
float(0.00685)
["pretransfer_time"]=>
float(0.055621)
["size_upload"]=>
float(171)
["size_download"]=>
float(134)
["speed_download"]=>
float(485)
["speed_upload"]=>
float(620)
["download_content_length"]=>
float(134)
["upload_content_length"]=>
float(171)
["starttransfer_time"]=>
float(0.275764)
["redirect_time"]=>
float(0)
["certinfo"]=>
array(0) {
}
["redirect_url"]=>
string(0) ""}
Я публикую и ожидаю ответ в формате JSON, а не в формате XML.
Увидеть https://developer.linkedin.com/docs/share-on-linkedin за документами я следую
Я уверен, что токен доступа верен, я подозреваю, что неправильно передаю его в заголовке «Авторизация: Носитель», или URL моей конечной точки не совсем корректен, я тоже попробовал это:
https://api.linkedin.com/v1/people/~/shares?format=json
а также
https://api.linkedin.com/v2/people/~/shares?format=json
Есть идеи? ПРИМЕЧАНИЕ. Я удалил большую часть токена доступа, не просите меня его опубликовать!
ОК, это странно. Мои токены доступа были возвращены (что я предположил, было правильно). После большого количества царапин на голове я решил перепроверить все, используя консоль API на apigee.com. Я проверил токен доступа и угадаю, что он вдвое длиннее всех токенов, которые я получил от Linkedin Oauth2 … Странно.
Поэтому я жестко запрограммировал этот новый токен доступа в мою систему — бум! Все работает (почему я когда-либо сомневаюсь в своем коде!)
Итак, я проверяю все, почему мой код доступа усекается? БД — Хорошо. Код — хорошо. Очень странно.
Я решил снова нажать на auth api, чтобы получить новый токен доступа (что-то, что я должен был сделать уже около 100 раз!) Привет, Престо! У меня теперь длинный код доступа.
Я понятия не имею, в чем проблема, но мой код сейчас работает.
Извините, что сказал вам об этом, но ваша документация оставляет желать лучшего, когда вы меняете спецификацию API, вам также необходимо обновить свои документы. У меня было много проблем, связанных с API. Кроме того, если вы собираетесь перевести свой отдел поддержки в Stackoverflow, хорошие практики требуют, чтобы вы отслеживали запросы.
Для всех, кто интересуется, библиотеки, перечисленные Linkedin, не работают после изменений, сделанных весной 2016 года. Основная проблема заключается в том, что все области были ограничены.
У меня была такая же проблема, и ответ был в этом:
Длина токенов доступа составляет ~ 500 символов. Мы рекомендуем, чтобы вы планировали, чтобы ваш стек приложений обрабатывал токены длиной не менее 1000 символов, чтобы соответствовать текущим и любым будущим планам расширения. Это относится как к токенам доступа, так и к токенам обновления.
В моем случае я использую Symfony 3.4 и Doctrine 2 в качестве ORM, у меня был этот фрагмент кода в аннотациях:
/**
* @var string
*
* @ORM\Column(name="access_token", type="string", length=255)
*/
private $accessToken;
Как видите, я не хранил токен полного доступа в базе данных для выполнения аутентифицированных запросов, поэтому изменил приведенный выше код:
/**
* @var text
*
* @ORM\Column(name="access_token", type="text")
*/
private $accessToken;
И все начало работать как шарм ….. Я надеюсь, что это помогает !!!!!