我正在尝试使用谷歌API管理用户的日历,我发现了一个问题。我在Google Developers Console上创建并配置了一个Google项目。其中一个设置是允许重定向uris ...我认为这没关系,因为经过一些测试谷歌投掷了相同的错误(redirect_uri_mismatch),我得到谷歌问我的权限...问题我认为是这个line:$ 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));
}
好的......第一个......它加载谷歌api自动加载器的构造函数和常量,创建一个新的Google_Client对象,并检查是否存在用户的权限文件,并且没有“代码”索引得到。
如果没有,它会调用重定向到谷歌的getCredentials函数
授予权限后,用户将重定向到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的代码变量的末尾总是有一个pad ...这样的东西:
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'];没有显示垫。
答案 0 :(得分:0)
您好,感谢@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的第一版如果您在控制台上更改某些内容,我需要重新下载(或重新编写)。
感谢。