TrogWarZ
@TrogWarZ
web developer

Использование нескольких ВК-приложений на PHP API – как не плодить условия на тип приложения?

Доброго времени!

В наличии API на PHP, а так же два клиента к нему: веб-сайт на Angular 1.x и iOS-приложение. А так же два ВК-приложения (сайт и standalone).
Необходимо на стороне API уметь получать список друзей, делал репосты и т.п., что не умеет не-standalone приложение.
Предполагается использование других API с теми же целями: ФБ, Твиттер и т.д.
Тут есть два подвопроса.

Первый – про организацию хранения токенов ВК приложений: как организовать получение и хранение токенов с минимальным изобретением велосипедов?
Пример ситуации. Юзер подключает ВК в личном кабинете на нашем сайте – API получает вк-токен как сайт. Затем юзер качает ios-приложение, логинится туда через ВК – API получает второй вк-токен, теперь уже standalone. Юзер на сайте жмёт кнопку "создать X и сделать об этом вк-репост".
Вопрос: как сделать этот репост со стороны API? Взять все возможные вк-токены из базы для этого юзера и "методом научного тыка" попробовать все пока не получится? Хранить в базе ещё и тип и плодить два условие типа:
if ('vkontakte' == $social->getProvider()) && 'standalone' == $social->getAppType())
    $social->postOnWall($entity);

Как вообще поступают в таких случаях на практике?

Второй – про библиотеки: какие?
Я пробовал использовать Hybridauth, но, кажется, бороться с ней приходится дольше.
Пример сложности с ней. Метод `authorize` зачем-то автоматически шлёт заголовки с редиректом, который Angular не в состоянии отловить – вместо того чтобы просто туда передать access_token и работать со всем внутренним апи соцсети. Все же методы типа `getUserProfile` внутри себя вызывают `isAuthorized`, который что-то там ищет в php-сессиях – которые вообще отключены в API за ненадобностью и никак не используются (вся работа с данными через Angular).
Вопрос: Есть идея добавлять в проект по одной библиотеке-зависимости, написать свой AbstractSocialAdapter и использовать какую-нибудь из этих библиотек в зависимости от ситуации. Но очень не хочется изобретать велосипеды.

Возможно, я делаю что-то совсем не правильно? Как такую задачу решаете вы? Хочется больше реальных примеров и best practice.

Спасибо.
  • Вопрос задан
  • 303 просмотра
Пригласить эксперта
Ответы на вопрос 1
@unity_ultra_hardcore
1. Хранить в базе ещё и тип и плодить два условие типа.

Да. Хранить рядом с токеном не только срок его действия, соцсеть из которой он получен (в случае, если все токены в одной таблице) и его тип: website/standalone
Эту проверку можно инкапсулировать внутр вашего $social:
If ($social->canPostOnWall($entity) {
    $social->postOnWall($entity);
}


Думаю, что в методе canPostOnWall те провайдеры, что не умеют постить оффлайн, должны просто возвращать false. А VK должен проверить наличие в хранилище токена с этим user_id, с expire > now() и с type = 'standalone' и пытаться запостить сообщение на стене, если подходящий токен нашёлся.
Ну, это если я верно понял вашу архитектуру.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы