Здравствуйте.
В ходе разработки появилась необходимость авторизовать пользователей в Google API через OAuth 2.0. Смысл такой: есть некая модель, и некоторые ее поля надо добавить в Google Calendar как событие.
На данный момент всё реализовано, как мне кажется, далеко не идеально.
Юзеру предлагается кликнуть на ссылку вида
/controller_name/gcalendar_initialize/137
где "137" - id объекта, который нужно добавить в календарь, а gcalendar_initialize - имя метода, который
начинает авторизацию в Google API. При этом он получает auth-url, а объект Google_Client и записывает id "137" записываются в сессию, после чего юзер переадресовывается на auth-url:
public function gcalendar_initialize($id) {
...
// записываем в сессию сериализованную версию объекта
$_SESSION['google_api_object'] = serialize($google_api_object);
// также записываем id
$_SESSION['id'] = $id;
// уходим по ссылке авторизации
header ('Location: '.$google_api_object->get_auth_url());
}
Далее происходит вот что: в той же вкладке браузера юзер попадает в меню гугл-авторизации, где авторизует наше приложение, после чего, в соответствии с текущими настройками, юзер переадресовывается обратно к нам на сайт по следующей ссылке, принося код авторизации
/controller_name/finish_authorization_in_gcalendar?code=...
Соответственно, выполнение кода возвращается в тот же контроллер, но другой метод, где в обмен на полученный код мы получаем authToken, из сессии считывается "137", после чего происходит добавление события в гугл-календарь, и снова таки редирект на страницу, откуда начали:
public function finish_authorization_in_google_calendar() {
...
// вытягиваем из сессии сериализованную версию объекта
$google_api_object = unserialize($_SESSION['google_api_object']);
// устанавливаем access token
$google_api_object->set_access_token_in_calendar($this->input->get('code'));
// переходим непосредственно к добавлению объекта в календарь
$created_event = $this->model_name->add_to_google_calendar($google_api_object, $_SESSION['id']);
// возвращаемся на страницу, с которой начали
header ('Location: /index.php/controller_name/?gcalendar_success='.$_SESSION['id']);
}
В итоге, всё работает, но, как мне кажется, сделано это достаточно криво, поскольку полно редиректов и всего прочего.
Сам гугл это делает довольно красиво, например на
этой странице можно попробовать функционал их API, нажав на бегунок OFF. При этом появляется новое окно (не pop-up), а после завершения действий в этом окне, на указанной странице статус меняется на ON.
Собственно, хотелось бы узнать, как правильно настроить авторизацию в этом API, как избежать постоянных редиректов.
Спасибо.
З.Ы. Используется библиотека google-api-php-client от Google.