Как получить данные о 5 млн компаний через LinkedIn REST API или почему в OAuth лучше разрешать использовать Request Token только один раз

в 16:39, , рубрики: api, linkedin, oauth, информационная безопасность, метки: , ,

Введение

С помощью LinkedIn Company Lookup API можно получить информацию о компании зарегистрированной на LinkedIn. Искать можно по ключевым словам, а можно и с помощью ID. Например, GET запрос

http://api.linkedin.com/v1/companies::(1337)

вернет информацию о самой компании LinkedIn. Весьма удобно, что через запятую можно указать сразу несколько ID, однако при этом стоит учитывать что слишком много ID указать в одном запросе также не получится из-за ограничения на размер самого запроса.

Также существуют органичения на количество запросов в день, которые устанавливаются как для приложения так и для отдельного пользователя. В частности, для получения информации о компаниях лимиты следующие:

Как получить данные о 5 млн компаний через LinkedIn REST API или почему в OAuth лучше разрешать использовать Request Token только один раз

Таким образом, как видно на рисунке выше, LinkedIn не позволяет одному пользователю получить информацию о более чем 500 компаниях в течении одного дня. При этом важно отметить, что считается именно количество запрашиваемых компаний, а не запросов (как говорилось выше, в одном запросе может запрашиваться информация сразу о нескольких компаниях).

Как это должно работать

Для авторизации запросов LinkedIn использует oAuth, причем на данный момент поддерживаются обе версии: OAuth 2.0, а также и более старая OAuth 1.0a. В случае использования версии 1.0a кратко механизм можно описать так:

  1. Делаем запрос к API чтобы получить ссылку для автороризации приложения, при этом также создается request_token.
  2. Необходимо открыть ссылку в браузере и вручную разрешить доступ для приложения.
  3. Сгенерированый ранее request_token используется для получения access_token (с помощью вызова соответствующего метода API).

Таким образом шаги, описанные выше, необходимо проделать только один раз, а access_token должен храниться в надежном месте и использоваться для всех последующих вызовов методов API. В этом случае мы и столкнемся с тем, что используя одного пользователя не сможем получить более 500 компаний в день.

Как это работало на самом деле

В реальности я попытался не получать access_token, а вызывать методы API используя request_token, сгенерированный на шаге 1 (шаг 2 в любом случае обязательный, иначе request_token будет непригоден). И в итоге я обнаружил, что методы API успешно работали и с request_token первые 5 минут (потом истекает его время жизни). Кроме того при таком способе не действовал лимит для пользователя, только лимит на 100 000 компаний в день для приложения. Однако тут на помощь приходит создание нескольких приложений. Очевидным минусом такого подходя является необходимость авторизации приложения каждые 5 минут. Но при должном уровне автоматизации и интеграции с браузером это не было большой проблемой. В итоге за пару дней неспешной работы простенького кода была скачана база с около 5 млн компаний хранящихся на LinkedIn.

Рекомендация

Не стоит давать возможность вызывать методы API (кроме метода получения access_token) с помощью временного request_token. Это рекомендация прописана в секции 6 OAuth 1.0а

P.S.: На текущий момент LinkedIn уже поправил ситуацию в соответствии с приведенной рекомендацией.

Автор: Ehuhaa

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js