Ошибка API Календаря Google redirect_uri_mismatch

Я пытаюсь использовать API Google для управления календарем пользователя и обнаружил проблему. Я создал и настроил проект Google в Google Developers Console. Одной из настроек был разрешенный URI перенаправления... и я думаю, что это нормально, потому что после некоторого теста, когда Google выдал ту же ошибку (redirect_uri_mismatch), я получил, что Google запрашивает у меня разрешения... проблема, я думаю, заключается в следующем. строка: $this->client->authenticate($_GET['code']);
Я покажу код и объясню, что он делает

function __construct() 
{
    parent::__construct();
    require __DIR__ . '/vendor/autoload.php';

    define('APPLICATION_NAME', 'Google Calendar API PHP Quickstart');
    define('CLIENT_SECRET_PATH', __DIR__ . '/credentials/client_secret.json');
    define('CREDENTIALS_PATH', __DIR__ .'/credentials/');
    define('SCOPES', implode(' ', array(Google_Service_Calendar::CALENDAR_READONLY)));
    // If modifying these scopes, delete your previously saved credentials
    // at ~/.credentials/calendar-php-quickstart.json

    $this->client = new Google_Client();
    $this->client->setApplicationName(APPLICATION_NAME);
    $this->client->setScopes(SCOPES);
    $this->client->setAuthConfigFile(CLIENT_SECRET_PATH);

    if (!file_exists(CLIENT_SECRET_PATH.$this->session->userdata("identity").".json") && !$this->input->get("code"))
        $this->getCredentials();
}

public function responseCredentials()
{
    $authCode           = $this->input->get("code");
    $this->client->authenticate($_GET['code']);
    $accessToken        = $this->client->client->getAccessToken();
    $credentialsPath    = CLIENT_SECRET_PATH.$this->session->userdata("identity").".json";
    mkdir(dirname($credentialsPath), 0700, true);

    file_put_contents($credentialsPath, $accessToken);
    redirect(base_url("dashboard"));
}
private function getCredentials()
{
    $this->client->setRedirectUri(base_url('calendar/responseCredentials'));
    $authUrl = $this->client->createAuthUrl();
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
}

Хорошо... во-первых... конструктор загружает автозагрузчик Google API и константы, создает новый объект Google_Client и проверяет, существует ли файл разрешений для пользователя и нет ли индекса "кода" при получении.
В противном случае вызывается функция getCredentials, которая перенаправляет пользователя в Google.
После предоставления разрешений пользователь перенаправляется на http://domain.com/calendar/responseCredentials (что настроено на console.developers.google)

Выдается такая ошибка:

Fatal error: Uncaught exception 'Google_Auth_Exception' with message 
'Error fetching OAuth2 access token, message: 'redirect_uri_mismatch'' in 
/var/www/html/prototipo/application/controllers/vendor/google/apiclient/src/Google/Auth/OAuth2.php:126 
Stack trace: 
#0 /var/www/html/prototipo/application/controllers/vendor/google/apiclient/src/Google/Client.php(128): Google_Auth_OAuth2->authenticate('4/rkAKNAmiVgs1Z...', false) 
#1 /var/www/html/prototipo/application/controllers/calendar.php(52): Google_Client->authenticate('4/rkAKNAmiVgs1Z...') 
#2 [internal function]: Calendar->responseCredentials() 
#3 /var/www/html/prototipo/system/core/CodeIgniter.php(360): call_user_func_array(Array, Array) 
#4 /var/www/html/prototipo/index.php(202): require_once('/var/www/html/p...') 
#5 {main} thrown in/var/www/html/prototipo/application/controllers/vendor/google/apiclient/src/Google/Auth/OAuth2.php on line 126

Что я делаю не так??
Спасибо.

РЕДАКТИРОВАТЬ

Я только что понял, что в конце переменной кода в возвращаемом uri всегда есть блокнот... что-то вроде этого:
http://pedro.eatec.es/prototipo/calendar_test_stack/responseCredentials?code=4/PL7nK1s9m5vpBow7HScaPmkpWpoW3J4uzUxlD7NE49g#https://developers.google.com/identity/protocols/OAuth2WebServer#handlingresponse не показать этот блокнот... Я пытался сделать это:

$this->client->authenticate($_GET['code']."#");

Но... конечно, не работает.
PS: Я пытался это сделать, потому что с помощью echo $_GET['code']; подушку не показал.


person Eloy Fernández Franco    schedule 12.03.2016    source источник
comment
Это может быть что-то маленькое, например, дополнительная косая черта (/) в конце вашего URL-адреса; убедитесь, что это 100% правильно.   -  person Pieter De Clercq    schedule 12.03.2016
comment
Спасибо @thepieterdc. Я просмотрел код и конфигурацию... Но ничего плохого не нашел. Я публикую ответ для предоставления дополнительной информации (слишком большой, чтобы ее можно было редактировать).   -  person Eloy Fernández Franco    schedule 12.03.2016


Ответы (1)


Привет и спасибо @thepieterdc, наконец, ты был причиной...

Я правильно настраивал проект на console.developers... но моя ошибка заключалась в том, что мне нужно сделать некоторые попытки получить правильную конфигурацию, и когда я должен сделать, исчезает ошибка 400 (со сломанным роботом), и он запрашивает у меня разрешение на функцию перенаправления, когда я делаю $this->g_client->authenticate($_GET['code']); код пытается сделать другой запрос (на OAuth2.php) к https://accounts.google.com/o/oauth2/token, и он использует client_id.json, который нужно обновить... а я этого не делал. Я ИСПОЛЬЗОВАЛ ПЕРВУЮ ВЕРСИЮ CLIENT_ID.JSON. Мне нужно повторно загрузить (или переписать), если вы что-то измените на консоли.

Спасибо.

person Eloy Fernández Franco    schedule 13.03.2016