vyshkant
@vyshkant
developer

Как правильно настроить авторизацию Google API OAuth 2.0 в CodeIgniter?

Здравствуйте.
В ходе разработки появилась необходимость авторизовать пользователей в 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.
  • Вопрос задан
  • 3611 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы