Не работает open api

Работа с ВКонтакте Open API в локальном окружении разработчика

Как многие знают, авторы социальной сети ВКонтакте около двух месяцев назад опубликовали Open API, с помощью которого сторонние сайты получили возможность аутентифицировать пользователей с помощью их аккаунтов ВКонтакте. В документации для разработчиков рассказывается, как настроить Open API для вашего сайта на production сервере. Но в реальной жизни разработка ведется на локальных машинах с хранением кода в системе контроля версий, а обноваления на production устанавливаются периодически.

При этом появляется проблема: как тестировать Open API на локальных машинах разработчиков, если доступ к ней настроен только для production-а? В данной статье я хочу рассказать о том, как настроить локальное окружение, чтобы работать с Open API в стандартном цикле разработки. Оговорюсь, что я рассмотрю разработку под Windows с использованием технологий Microsoft, но идея может быть легко перенесена на другие платформы.

Итак, суть проблемы. Как сказано в документации, для настройки необходимо создать приложение ВКонтакте. При этом важно указать адрес вашего сайта и базовый домен:

При инициализации Open API на вашем сайте ВКонтакте сопоставит идентификатор приложения, указанный в параметре apiId и URL сайта, на котором эта инициализация производится. Если URL не совпадет с параметрами, введенными в настройках вашего приложения (см. выше), то мы получим сообщение об ошибке: “Open API security breach”. Это проблема, т.к., например, при разработке с использованием Visual Studio сайты часто тестируются локально с использованием встроенного веб-сервера по адресу http://localhost:port (где port – число, номер порта). Но при этом Open API перестает работать по указанным выше причинам – на локальных машинах ВКонтакт попадает не разрешенный адрес сайта (http://example.com), а адрес локального сайта http://localhost:port. Как решить эту проблему?

Суть решения довольно проста: необходимо настроить локальное окружение таким образом, чтобы запросы на адрес сайта, указанный в настройках приложения ВКонтакте (http://example.com), перенаправлялись не на доступный в интернете production сервер через DNS, а на локальных сайт на машине разработчика. При этом разработчик сможет тестировать Open API, т.к. теперь его локальный сайт будет иметь разрешенный с точки зрения ВКонтакте адрес http://example.com.

Настройка состоит из нескольких шагов. Прежде всего, необходимо отредактировать файл windows\system32\drivers\etc\hosts. Необходимо вставить следующую запись:

Т.о. все запросы на адрес example.com будут перенаправляться на локальную машину. Теперь надо настроить локальный веб-сервер (в нашем случае это IIS 7), чтобы запросы на адрес example.com перенаправлять на локальную копию сайта разработчика. Для этого нужно создать новый веб сайт в IIS Manager, настроить физический путь на папку с файлами сайта и указать при этом следующие привязки (bindings):

И, наконец, последний шаг в том случае, если на локальной машине используется прокси. В настройках браузера (в IE это Tools > Internet Options > Connections > LAN Settings > Advanced) необходимо добавить example.com в список исключений (Do not use proxy server for addresses beginning with).

Несколько ограничений описанного подхода: во-первых, разработчики не смогут ходить на production сайт со своих машин и на локальный сайт одновременно. Для того чтобы зати на production им потребуется поменять свой файл hosts (убрать указанную выше запись). И во-вторых, они будут вынуждены использовать IIS в качестве веб-сервера при разработке, отказавшись от встроенного веб-сервера Visual Studio. Но как показывает практика последнее ограничение – скорее плюс, т.к. окружение разработчика будет ближе к реальному окружению на production сервере.

Источник

Читайте также:  Додж караван не работает омыватель заднего стекла

У вас нет разрешения на доступ к API. OpenCart

Простой случай

Как правило проблема с доступом к API OpenCart возникает когда не настроен доступ по API.

IP адрес еще не добавлен в список разрешенных для доступа по API

Для решения этой проблемы нужно пройти в админке в Система-Пользователи-API , зайти в нужный объект списка и добавить свой IP адрес в список.

Добавляем свой IP адрес в список разрешенных для доступа по API

Либо на странице, с сообщением о проблеме с API просто нажать на кнопку Добавить IP-адрес и обновить страницу.

Но у нашего клиента на OpenCart 2.3 было не все так просто .

Случай клиента

Перед началом разработки модуля клиент сообщил мне, что в админке на странице редактирования заказа у него часто/рандомно не работает изменение заказа: У вас нет разрешения на доступ к API!

А как позже выяснилось, такая проблема у клиента на 2 сайтах, где используется одна и та же версия OpenCart 2.3, сайты размещены у одного и того же хостера.

Сообщение которое часто вылезало на странице редактирования заказа

Изначально я не придал этому значения, так как проблема у клиента была до меня, а сроки по разработке были крайне сжатые (как обычно), а значит ее решение это второстепенная задача, однако на этапе внедрения модуля в интернет-магазин клиента начались проблемы.

Дело в том, что интерфейс функциональности разработанного мной модуля располагался на странице редактирования заказа, во вкладке Товары , а из-за проблем доступа к API клиент не мог проверить работу модуля. Но это была первая часть проблемы. Как выяснилось позже мой модуль не мог корректно функционировать, так как использовал доступ к заказу основываясь на API.

Стоит уточнить, что интерфейс редактирования заказа во многом построен на Ajax API OpenCart, с использованием авторизации и получением токена для доступа к API.

Первым делом я перепроверил ajax запросы на корретность работы, как на клиенте так и на сервере. Токен на клиенте есть, проверка токена и авторизация по токену на сервере есть. Все также как и у API запросов, но не работает .

В чем проблема?

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

Посмотрим контроллер catalog/controller/api/login.php (запрос получения токена для работы с API /index.php?route=api/login ), в случае валидного API key и наличия в этой группе IP адреса выполняющего (того кто делает запрос), данный запрос стартует новую сессию с именем api с единственным ключом api_id :

Затем посмотрим catalog/controller/startup/session.php (это первичный контроллер, который запускается при любом запросе в catalog , до основного контроллера), здесь при наличии токена полученного в предыдущем запросе происходит старт сессии с именем api :

А теперь пройдем в файл с классом сессии system/library/session.php и смотрим метод start :

На основании предыдущих файлов можно сказать: session_id может быть взят из куки api , а данные сессии можно получить по session_id .

Читайте также:  Peugeot partner 2004 не работает вентилятор

Вспоминаем что API запросы OpenCart проверяют валидность доступа в catalog контекст по токену следующим образом:

И приходим к понимаю того, что с сессией проблемы, хотя судя по коду должно быть все ровно.

Для того чтобы понять в чем проблема, можно попробовать записывать данные $_SESSION в файл в запросе получения токена (после его получения), и при первом API запросе в файле catalog/controller/startup/session.php прямо перед или после старта api сессии.

В итоге я увидел что:

Сессия с session_id создается на этапе авторизации и в нее записывается один единственный ключ api_key , но уже при следующем запросе к API, массив данных сессии с этим session_id пуст, но заполняется при отработке всех контроллеров указанных в массиве action_pre_action (в файле system/config/catalog.php ) и данные сессии сохраняются.

Однако при этом в нем отсутствует ключ api_id , без которого дальнейшая работа с API невозможна и поэтому мы видим сообщение: У вас нет разрешения на доступ к API!

Решение проблем

Почему возникает данная проблема мне не удалось выяснить. Развернув точную копию сайта клиента у себя на локальном сервере, воспроизвести проблему не получилось.

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

Повторный дебаг $_SESSION не дал результатов, все также: при запросе авторизации создавалась новая сессия с ключом api_id , а при следующем обращении к API эта новая сессия была пуста.

Понимая что данные сессии не могут сохранится в $_SESSION при запросе авторизации снова смотрим catalog/controller/startup/session.php и видим запрос к БД:

Если этот запрос возвращает не пустой массив, значит можно считать что авторизация прошла успешно, а среди выбранных из БД данных есть api_id .

В catalog/controller/startup/session.php сразу после старта сессии пишем:

И проблема У вас нет разрешения на доступ к API! решена!

Для решения проблемы У вас нет разрешения на доступ к API! в данном случае достаточно после старта сессии в catalog/controller/startup/session.php вставить в массив сессии ключ api_id : $this->session->data[«api_id»] = $query->row[«api_id»];

Для убедительности я провел тест: получил ошибку У вас нет разрешения на доступ к API!, а затем применил описанное выше решение и не перезагружая страницы (где была ошибка) провел несколько ajax запросов к API OpenCart, которые прошли успешно.

Клиент доволен, оба сайта работают, проблема решена. Однако, источник проблемы не выявлен, есть несколько предположений, возможно как-нибудь проверю.

Источник

Не работает open api

Хм, у меня фактически аналогичный вопрос. Подключаю свой сайт к Open API, вся инициализация и авторизация проходит нормально. Но вот после этого участка:

VK.Auth.login(function(response) <
if(response.session) <
if(response.settings) <
if((response.settings & 1) != 1) <
VK.Api.call(‘showSettingsBox’, , function(r)<

На моменте вызова VK.Api.call(‘showSettingsBox’) возвращается полностью аналогичная ошибка (Unknown method passed).

Ну пардон, тут документацию пишут не для людей — всё свалено в одну кучу, всё в одном: и Open API для сторонних сайтов, и JS API для IFrame, и Flash API.
В частности, вот тут: http://vkontakte.ru/developers.php?o=-1&p=Open+AP.. сказано, что Open API (а для внешних сайтов используется именно он, ведь так?) имеет следующие методы:

VK.init — основной метод инициализации платформы Open API.
VK.Auth — содержит методы, связанные с авторизацией пользователей.
VK.Api — содержит методы, связанные с работой с ВКонтакте API.
VK.Observer — содержит методы для реакции на возникающие в ходе работы платформы события.
VK.UI — содержит методы, связанные с интерфейсом пользователя.

Читайте также:  Чем отремонтировать фундамент деревянного дома

Логично, что нам отсюда нужно именно VK.Api. Переходим на описание VK.Api (http://vkontakte.ru/developers.php?o=-1&p=VK.Api ) и видим описание как этот метод работает. Нам нужно вызвать окно настроек приложения с требуемым доступом (в моём случае это возможность присылать уведомления, то есть битовая маска 1). За это отвечает метод showSettingsBox (http://vkontakte.ru/developers.php?o=-1&p=IFrame-.. ), у которого есть один параметр settings.

Спрашивается где я тут написал бред и где я не так понял документацию? Надеюсь сейчас-то вы убедились, что как раз-таки документацию я перечитываю полностью.

Я же дал: http://vkontakte.ru/developers.php?o=-1&p=IFrame-..
Там подзаголовок «Вызов методов Javascript API». Среди методов там showSettingsBox: «Открывает окно с пользовательскими настройками приложения. Параметр settings – это битовая маска запрашиваемых настроек. Если параметр settings равен 0, то пользователю будет предложено разрешить все действия приложению. Подробнее о настройках приложения можно прочитать в описании метода getUserSettings. На запуск этого метода действует ограничение – не чаще одного раза в 3 секунды.»

Причём тут кнопка-то? Авторизация пользователя на сайте происходит с помощью метода VK.Auth.login, у которого вторым параметром как раз идёт битовая маска пользовательских настроек приложения. Если на нужной нам настройке у пользователя галочка не стоит, то появится окно, в котором запрашивается необходимый нам доступ. Если пользователь соответствующую настройку разрешит, то в функцию обратного вызова метода VK.Auth.login вернётся объект, среди полей которого будет «settings» со значением битовой маски установленных настроек. Если же он НЕ разрешит соответствующую настройку, то соответственно нам ему надо как-то сказать, что для дальнейшей работы вам нужна эта настройка, пожалуйста, поставьте галочку. И вызвать это окно настроек приложения снова.

Вы используете Опен АПИ а лезете и используете ИФРЕЙМ
VK.callMethod —- работает только для ифрейм
showSettingsBox —- работает только для ифрейм

>Причем тут кнопка?
А притом что в офф примере через нее происходила авторизация и вы ей пользуйтесь

И вообще вы задаете вопрос не по теме данной группы, здесь только IFRAME

> VK.callMethod —- работает только для ифрейм
> showSettingsBox —- работает только для ифрейм

Я и говорю, документация делалась для экстрасенсов.

> А притом что в офф примере через нее происходила авторизация и вы ей пользуйтесь

Не обязательно ей пользоваться, может я хочу чтобы без кнопки, сразу же при заходе на сайт пользователь авторизовывался. Для этого и есть метод VK.Auth. И вопрос вообще не в авторизации — она у меня проходит прекрасно и пользователь легко авторизовывается. Вопрос куда более конкретный — как вызвать окно настроек приложения?

> И вообще вы задаете вопрос не по теме данной группы, здесь только IFRAME

А групп по Open API ВООБЩЕ нет. В группе просто «Вконтакте API» новые темы создавать запрещено. Спрашивается — куда писать, где спрашивать, у кого интересоваться? А IFrame-приложения из существующего как раз наиболее близки по схеме работы к Open API, так что логичнее искать единомышленников и советчиков тут. Но как видно, это бесполезно. Толком конкретно ответить не можете, выставляете каким-то лохом, не читающим документацию, спасибо хоть на три буквы не посылаете.

Источник

Оцените статью