Приложение для apps.com на PHP — особенности и грабли

image

Предисловие для тех кто ничего не слышал ни о QB ни о apps.com
Данный пост уже был мною опубликован в далёком 2015 году, но был быстро убран в черновики по причине низкой оценки. Уж не знаю — может я был молод и глуп плохо изложил суть, может тема не сильно востребована, но вот как-то так… И так бы он и остался в черновиках, если бы не сегоднешнее письмо на моей почте. Незнакомый мне разработчик искал информацию по QuickBooks, судя по всему нашёл только мой пост, и написал мне на почту чтобы узнать детали. Из этого я сделал вывод что тема может быть интересной, и хотя описанное ниже происходило почти 2 года назад, я не думаю что всё очень сильно изменилось с того времени. Поэтому небольшие правки — и публикую пост снова. Заплюют так заплюют :)

Сразу предупрежу: сайт apps.com — очень странный. Без каких либо причин время от времени он перестаёт грузиться вообще, либо же не отдаёт половину стилей и картинок. Я, чесно говоря, немного в шоке с такого поведения, всё-таки такой домен, серъёзная контора, и такой прикол. Так что если вы никогда не слышали о apps.com, зашли глянуть что это — а там сломанное нечто, то это не значит что я описываю какую-то фигню (как предполагали комментаторы в прошлый раз). Просто на apps.com снова пошло что-то не так :) Вот, если что, пример нормального вида




Как-то раз, одним прекрасным (или не очень) днём мне прилетел новый таск. «Влад, поздравляю, ты будешь пилить приложение для QuickBooks». «Квикбукс? Что за...» — подумал я, но отказаться не мог, таск есть таск. «Ну, погуглю что такое квикбукс, потом что такое квикбукс-приложение, потом читну статью на хабре об этом всём, потом найти sdk, и дело в шляпе» — подумал я, и открыл гугл. Как же я ошибался…



Первое — хабр ничего не знает по поводу всего этого. Нет, есть три с половиной статьи в которых упомянут QuickBooks (далее просто — QB), но ничего полезного я в них не нашёл. Меня это сразу же смутило — как так, вроде известная вещь — а хабр молчит. Странно.

Второе — пришлось убить немного времени на то чтобы понять что такое «QuickBooks Application», и с чем его едят. Не знаю, может это только я туго доходящий, но я не сразу понял что «приложение» — это просто сайт, веб-сервис. При слове «приложение» у меня сразу возникли мысли о чём-то ином, о каком-нибудь хостинге от QB, о хитрой-хитрой апишке. Оказалось попроще. Ох уж эта мода называть всё в web — приложением.

И третье — официальный PHP SDK для QuickBooks Online. А его нет. Точнее как — он то есть, но он настолько неполный, плохо документированный и недоделанный что использовать его не представлялось возможным. В нём напрочь отсутствовала часть API мне необходимая. Не знаю, возможно его уже допилили, но я сильно в этом сомневаюсь. На момент написания поста — он так и остаётся убогим.

В целом, этот пост для тех кому понадобится так же само создать приложение для QB на PHP. Он поможет по-быстрому осознать основные моменты и грабли на которые я наступил. Местами будут просто очевидные вещи из документации — но я предпочёл ещё раз их уточнить.

Постой… что за QuickBooks, что за apps.com, ты вообще о чём?



Обо всём по-порядку. QuickBooks — это американский онлайн-сервис для бухгалтерии. Серъёзный сервис, не поделка двух студентов. И хотя у нас его почти никто не знает, но по ту сторону океана это очень даже известный продукт. Я даже помню чей-то пост на хабре о эмиграции в США, и тонкостях ведения бухгалтерии. Тот человек писал что с помощью QB ему удалось вести бухгалтерию самостоятельно, почти ничего в этом не соображая.

Apps.com — это, грубо говоря, каталог сайтов с интеграцией QB. Что-то типа App Store или Play Market, только более узкоспециализированно. Мне аж интересно как они выхватили такой домен.

Итак, что же вообще такое QuickBooks Application, и с чем его едят



Как я уже сказал выше — по своей сути QuickBooks Application это сайт. Это может быть отдельный сайт (как получилось в моём случае) или же его часть. Если обобщить — это просто тесная интеграция сайта с QB которая позволяет логиниться через него, получать кое-какие данные и совершать операции. И если всё по интуитовскому фэн-шую (intuit — компания-владелец QB) — вам разрешат разместить ваше приложение на Apps.com.

Проблемы с PHP



Как я опять таки уже писал выше — с PHP есть некоторая проблема. По сути, вы не можете использовать официальный PHP-SDK для QuickBooks Online (далее — QBO). Я не знаю, может для чьих-то нужд его и будет достаточно, но он настолько неполный и слабо документирован что я сомневаюсь в его целеобразности.

UPD. в 2017 — они, вроде, немного допилили это всё дело, но похоже на то что PHP SDK всё ещё неполноценен. Надо смотреть точнее под определённые нужды.

Так, о PHP. Всё было бы совсем плохо если бы не ребята из ConsoliByte (не сочтите за рекламу). Судя по их сайту — они то-ли предлагают свои услуги по QB, то-ли просто консультанты — не знаю вообщем, но факт в том что они создали OpenSource QBOv3 PHP-SDK. Более того — ссылку на него разместили даже в документации самого квикбукса, как «3-rd party contibuted». Так что несмотря на то что код этого SDK — не образец прекрасного — используем его. Тыц. Там же есть и готовый мини-пример в который нужно только подсунуть апи-ключи.

image
Мой некрасивый скриншот


Суть приложения



Суть работы приложения заключается в следующем — юзер подключается к вашему приложению (разрешает ему доступ к своим данным, если говорить проще) и потом работает с ним. Всё просто!

Для подключения используется фирменная кнопка от QB. Интересность в том, что использовать можно ТОЛЬКО её. Юзер может подключится к вам напрямую с apps.com, через интерфейс QBO, или же прямо из приложения через эту кнопку. Вы не имеете права изменять её внешний вид, размеры, надписи — только использовать такую как выдаёт QB (есть в двух цветах и четырёх размерах). Вы не имеете право как-то по другому инициализировать подключение вашего приложения. Только через кнопку «Connect to QB» которая в документации называется не иначе как «C2QB Widget». Это во-первых. Во-вторых, как окажется позже — эту кнопку нельзя использовать для аутентефикации юзера в вашем приложении. В нашем приложении не было системы аутентификации — оно отделённое от основного сайта и других юзеров просто не бывает. Поэтому первоначально я сделал всё так — коннектим юзера, если он новый — пишем его в базу, и пошло-поехало. Для моих нужд этого было достаточно. Как оказалось позже — так нельзя. Для аутентификации нужно использовать только «Sign in using QB» виджет, и кнопка C2QB должна быть внутри приложения, и только так. Неприятно было узнать об этом в самом конце.

Connect To QuickBooks будет работать через OAuth (всё скрыто под капотом SDK, довольно удобно), Sign in — через OpenId. Я использовал библиотеку LightOpenId тыц, опять таки — OpenSource.

Когда я работал с примером из SDK — я не сильно углублялся в конфиг, и пропустил мимо взгляда параметр the_tenant. Я не встречал его в документации или readme поэтому не придал этому особого значения. Не знаю, может это общепризнанное название — но я его не встречал ранее. Как оказалось позже — это идентификатор нашего юзера который сделал коннект к нашему приложению. Каждому юзеру надо его предоставлять. У меня получилась забавная история с этим — tenant у меня был статический, в конфиге, и отправил я приложение на ревью. Захожу — залогинен как квикбуксовский юзер какой-то. «Тю» — подумал я, и забыл. А потом начал замечать что я постоянно уже под кем-то залогинен. Разлогинился, попросил коллегу зайти со своего компа, потом обновил страницу — и я залогинен! Ох ты ж ёжик…

Review для публикации на apps.com



Для того чтобы ваше приложение пустили на apps.com — оно обязано пройти 3 вида проверок. Marketing, Security и Functional reviews. Происходит это так — вы сабмитите своё приложение. Через время вам начинают писать с трёх имейлов (3 проверки) о том что у вас не так.

Marketing проверка смотрит на ваше описание приложения, скриншоты с него, наличие саппорта, и всё такое. Грубо говоря — проверка того что вы красиво его представляете.

Аудит безопасности проводит внешняя компания cigital.com, по наёму интуитом. Они делают аудит а потом присылают вам отчёт, который гласит где что плохого, как это зарепродьюсить и как зафиксить. Отличный, вообщем-то репорт. Тестят судя по всему какими то скриптами, проверяют все возможные уязвимости. У нас в приложении есть открытая форма — для фидбека. Так вот судя по всему — их скрипт атакует все формы которые находит, потому что нам на почту пришло тысячи полторы писем с этой формы в которых менялся только текст в стиле . 4 поля в форме — тупой перебор каждого из 300+ (примерно) вариантов для каждого поля. Если честно — до сих пор не понимаю что они проверяли этим. Форма нигде не выводится в приложении, откуда им знать если что-то сработает? Кстати, на форумах я читал что-то о том что они проводят и код-ревью, но, наверное, это было раньше — ибо у нас никакого кода не просили. Грабли на которые мы наступили:

1) Server:Apache/2.4.7 (Ubuntu)
X-Powered-By:PHP/5.5.9-1ubuntu4.12 — вот такие хедеры в респонсе от сервера. Это уязвимость типа «Лишняя информация отдаваемая сервером», хоть и с минимальным priоrity.
2) Cookie не через https. С этим отдельная история. Почему-то аудит они проводили не на прод-приложении, а на нашем стейджинге. Естественно, никто не будет покупать ssl для стейджинга, поэтому https там не было. За что получили 5 или 6 записей. Чтобы быть честным — проблемы это не составило, мы просто написали что это стейджинг а на проде всё норм будет — и нам поверили на слово.
3) Возможность замены куки. the_tenant (о котором я писал выше) хранится в куках, и если его изменить — приложение успешно его принимало. Это не представляло никакой опасности, на самом деле, да и сами они написали что это самый низкий приоритет, но всё же.

Ревью функционала. Люди (вручную) проверяют и нажимают всё что может и умеет ваше приложение. Если что не так (вёрстка поплыла, ошибка вылезла, не сработало вообще, и т.д.) — пишут мол так и так. Иногда даже видео аттачат, как они это воспроизвели. И да, ещё одно — проверяйте слово QuickBooks! В правилах написано что не допускается никаких сокращений, и QuickBooks должно писаться как QuickBooks, и никак иначе. У меня в нескольких местах было Quickbooks («b» с маленькой) — на это сразу же указали мол проблема. Так что надо следить.

UPD. 2017 — как оказалось, такой ревью происходит каждый год, а не только при публикации. Довольно логично.

Итог



Cпустя чуть больше месяца я зафиксил всё что у нас нашли, и мы успешно прошли ревью. Сейчас наше приложение успешно размещается на apps.com. Показать, увы, не могу — ибо NDA. Что интересно — после размещения можно делать что угодно в коде, повторного ревью не нужно. Для изменений описания — нужно, а функционал — меняй сколько влезет. Следующий ревью будет только через год после публикации.

Надеюсь мой пост кому-нибудь пригодится и благодаря ему он съэкономит несколько часов своей жизни. Если что не так — пишите в комментарии, вполне возможно что я что-то неправильно описал
  • –1
  • 1,4k
  • 2
Поделиться публикацией

Комментарии 2

    +3
    Первый раз слышу о такой радости, зашел посмотреть, что же это такое и зачем нужно (из статьи ничего не понятно), а там такая радость:
    The identity of this website has not been verified.
    • Server's certificate does not match the URL.

    Вот и думаю.
      0
      Внезапно, спустя 2 года, отредактировал и обновил пост. Теперь должно быть чуть понятнее ;)

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое