- PVSM.RU - https://www.pvsm.ru -
Мобильное приложение Starbucks — один из самых известных кейсов в ecommerce. Автор материала — программист опытным путем доказывающий, почему стоит открыть API этого приложения.
Стоит отдать должное приложению Starbucks — оно просто отличное. Я использую его (как минимум) раз в день. В нем есть все, что мне нужно от отличного мобильного сервиса — кофе, плейлисты хитов 80-х в Spotify [1] и возможность избежать живого общения с другими людьми. Я явно не одинок в своих предпочтениях, так как 20% операций Starbucks в США [2] сейчас производится через мобильные телефоны.
Помимо интеграции Slack [3] и кофейных кнопок [4] существует множество других интеграций, которые можно было бы реализовать, если бы компания открыла свой API для сторонних разработчиков. Она явно движется в этом направлении, поскольку у нее есть и аккаунт в Twitter, и (защищенный паролем) веб-сайт для разработчиков.
Однако я не мог ждать и поэтому решил взять дело в свои руки.
Приложение Starbucks оказалось крепким орешком. Несмотря на URL-адрес «openapi.starbucks.com», пришлось пробираться через серьезные дебри, прежде чем начать анализировать вызовы, совершаемые приложением. Как и для любого другого приложения, обрабатывающего платежи, Starbucks предпринял многочисленные меры безопасности для защиты API, используемых своим приложением, от несанкционированного использования. Вот некоторые из них:
Для начала мне нужен был способ наблюдать за запросами и ответами, которыми обменивались приложение Starbucks и его сервера. Обычно я просто настраивал свой iPhone на Charles [8] (или mitmproxy [9]), и этого было достаточно.
Но не в этот раз! Поскольку приложение использует certificate pinning, я не смог перехватить его запросы, как обычно. Вместо этого мне пришлось откопать свой старый телефон на Android, получить root-права [10], установить фреймворк под названием Xposed [11] и, наконец, установить расширение [12], которое внедряется в запущенные приложения и отключает SSL pinning.
Муахаха
После его запуска я смог начать просмотр запросов с использованием прокси-сервера Charles. Однако это оказалось скорее ложной надеждой, так как не все запросы можно было легко воспроизвести. Тем не менее, я смог запросить основную информацию, например, о ближайших магазинах, меню и балансах карт.
Результат запроса о ближайшем магазине. Теперь вы знаете, где я работаю. Упс.
«Это легко», — думал я, — «Я просто размещу заказ, подключившись к прокси-серверу, и потом воспроизведу запросы!»
А вот и нет.
Как выяснилось, токены доступа Starbucks действительны всего один час, поэтому нельзя просто взять и пользоваться тем токеном, который использует ваш телефон. Это создает определенные трудности…
Конечная точка OAuth, используемая приложением, перед выдачей токена проверяет три параметра:
Я начал пытаться сформировать некоторые из них самостоятельно. Я смог получить ключ шифрования, используемый для создания deviceFingerprint, используя джейлбрейкнутый iPhone для расшифровки фреймворков внутри приложения Starbucks. Изучив фреймворк в Hopper [16] в течение некоторого времени, я в конечном итоге смог отследить вызов к функции Apple CCCrypt [17].
www.youtube.com/watch?v=o8ZnCT14nRc [18]
Затем я прилинковал фреймворк SBXData (фреймворк, который я ранее расшифровал на джейлбрейкнутом телефоне) в наскоро созданное приложение и воспользовался Fishhook [19] для переназначения этой функции собственной реализации. Это позволило мне выгрузить ключ и связанные с ним параметры в консоль:
Аналогичным образом удалось выяснить, как генерировать заголовок «X-Cbt». Для краткости изложения, я оставлю эту задачу вам :)
После того, как я смог подписать и снять отпечатки со своих запросов на вход, я объединил все в небольшой модуль Node.js, который позволяет использовать некоторые основные функции API Starbucks. Хорошие новости: он (в основном) размещен здесь [20] на GitHub!
Вуаля! Программируемый кофе.
Автор: Fondy
Источник [21]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/260824
Ссылки в тексте:
[1] плейлисты хитов 80-х в Spotify: https://open.spotify.com/user/starbucks/playlist/1KgSFElrtKsbvFBPDLUg7f
[2] 20% операций Starbucks в США: https://news.starbucks.com/uploads/documents/Fact_Sheet_-_Mobile_Order__Pay_National_Launch_2015.pdf
[3] интеграции Slack: https://api.slack.com/internal-integrations
[4] кофейных кнопок: http://ryanpickren.com/starbucks-button
[5] SSL certificate pinning: https://en.wikipedia.org/wiki/Transport_Layer_Security#Certificate_pinning
[6] Создание цифрового отпечатка: https://www.iovation.com/
[7] атрибутов: https://www.threatmetrix.com/
[8] Charles: https://www.charlesproxy.com/
[9] mitmproxy: https://mitmproxy.org/
[10] получить root-права: https://en.wikipedia.org/wiki/Rooting_%28Android_OS%29
[11] Xposed: http://repo.xposed.info/module/de.robv.android.xposed.installer
[12] расширение: https://github.com/Fuzion24/JustTrustMe
[13] выяснил: https://www.ryanpickren.com/starbucks-button
[14] конкатенированные: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%BA%D0%B0%D1%82%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D1%8F
[15] функцию MD5-хэширования: https://ru.wikipedia.org/wiki/MD5
[16] Hopper: https://www.hopperapp.com/
[17] Apple CCCrypt: https://opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/CommonCrypto/CommonCryptor.h
[18] www.youtube.com/watch?v=o8ZnCT14nRc: https://www.youtube.com/watch?v=o8ZnCT14nRc
[19] Fishhook: https://github.com/facebook/fishhook
[20] здесь: https://github.com/tendigi/starbucks
[21] Источник: https://habrahabr.ru/post/322800/
Нажмите здесь для печати.