导入 google 个联系人时出现 OAuth 问题
OAuth issue in importing google contacts
早上好 - 我正在使用以下 YouTube 教程 Tutoriel PHP - Importer des contacts Google 尝试导入 Google 个联系人。
当我单击 link 导入 Google 联系人时,我没有请求许可并获取联系人并将其显示在屏幕上,而是出现以下错误:
Warning: Missing argument 1 for Google_Client::authenticate(), called
in /var/www/html/restaurant_test/index.php on line 34 and defined in
/var/www/html/restaurant_test/lib/google-api-client/Google_Client.php
on line 124
Notice: Undefined variable: code in
/var/www/html/restaurant_test/lib/google-api-client/Google_Client.php
on line 127
Fatal error: Uncaught exception 'Google_Auth_Exception' with message
'Invalid code' in
/var/www/html/restaurant_test/lib/google-api-client/Auth/OAuth2.php:88
Stack trace: #0
/var/www/html/restaurant_test/lib/google-api-client/Google_Client.php(127):
Google_Auth_OAuth2->authenticate(NULL, false) #1
/var/www/html/restaurant_test/index.php(34):
Google_Client->authenticate() #2 {main} thrown in
/var/www/html/restaurant_test/lib/google-api-client/Auth/OAuth2.php on
line 88
请告诉我如何修复错误。谢谢。
这是我的代码:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
session_start(); ?>
<!DOCTYPE html>
<html class="no-js" lang="en"/>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Google Contacts API</title>
</head>
<body>
<h2>Google Contacts API v3.0</h2>
<?php
require_once 'lib/google-api-client/autoload.php';
require 'lib/google-api-client/Config.php';
require 'lib/google-api-client/Google_Client.php';
$client_id = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbb.cccccccccccc.com';
$client_secret = 'oUe3fsfds4gfg23ha93kmKFkfgKZ';
$redirect_uri = 'http://ccccccccccccccccccc.com/rddddddddddd/index.php';
$client = new Google_Client();
$client -> setApplicationName('contact');
$client -> setClientid($client_id);
$client -> setClientSecret($client_secret);
$client -> setScopes('https://www.google.com/m8/feeds');
$client -> setRedirectUri($redirect_uri);
$client -> setAccessType('online');
if (isset($_GET['code'])) {
$client->authenticate();
$_SESSION['token'] = $client->getAccessToken();
header('Location: ' . $redirect_uri);
}
if(!isset($_SESSION['token']))
{
$url = $client->createAuthUrl();
echo '<a href="' . $url . '">Import Google Contacts</a>';
}else{
$client->setAccessToken($_SESSION['token']);
$token = json_decode($_SESSION['token']);
$token->access_token;
$curl = curl_init("https://www.google.com/m8/feeds/contacts/default/full?alt=json&max-results=50&access_token=" . $token->access_token);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$contacts_json = curl_exec($curl);
curl_close($curl);
$contacts = json_decode($contacts_json, true);
$return = array();
foreach($contacts['feed']['entry'] as $contact){
$return[] = array(
'name' => $contact['title']['$t'],
'email' => isset($contact['gd$email'][0]['address']) ? $contact['gd$email'][0]['address'] : false,
'phone' => isset($contact['gd$phoneNumber'][0]['$t']) ? $contact['gd$phoneNumber'][0]['$t'] :false,
);
}
var_dump($return);
}
?>
</body>
</html>
您似乎忘记将 code
传递给 authenticate
方法。这是 Google_Client.php
中 authenticate
方法的文档和实现:
/**
* Attempt to exchange a code for an valid authentication token.
* If $crossClient is set to true, the request body will not include
* the request_uri argument
* Helper wrapped around the OAuth 2.0 implementation.
*
* @param $code string code from accounts.google.com
* @param $crossClient boolean, whether this is a cross-client authentication
* @return string token
*/
public function authenticate($code, $crossClient = false)
{
$this->authenticated = true;
return $this->getAuth()->authenticate($code, $crossClient);
}
因此,如下更改代码很可能会解决问题:
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']); // <-- Add code parameter here
$_SESSION['token'] = $client->getAccessToken();
header('Location: ' . $redirect_uri);
}
早上好 - 我正在使用以下 YouTube 教程 Tutoriel PHP - Importer des contacts Google 尝试导入 Google 个联系人。
当我单击 link 导入 Google 联系人时,我没有请求许可并获取联系人并将其显示在屏幕上,而是出现以下错误:
Warning: Missing argument 1 for Google_Client::authenticate(), called in /var/www/html/restaurant_test/index.php on line 34 and defined in /var/www/html/restaurant_test/lib/google-api-client/Google_Client.php on line 124
Notice: Undefined variable: code in /var/www/html/restaurant_test/lib/google-api-client/Google_Client.php on line 127
Fatal error: Uncaught exception 'Google_Auth_Exception' with message 'Invalid code' in /var/www/html/restaurant_test/lib/google-api-client/Auth/OAuth2.php:88 Stack trace: #0 /var/www/html/restaurant_test/lib/google-api-client/Google_Client.php(127): Google_Auth_OAuth2->authenticate(NULL, false) #1 /var/www/html/restaurant_test/index.php(34): Google_Client->authenticate() #2 {main} thrown in /var/www/html/restaurant_test/lib/google-api-client/Auth/OAuth2.php on line 88
请告诉我如何修复错误。谢谢。
这是我的代码:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
session_start(); ?>
<!DOCTYPE html>
<html class="no-js" lang="en"/>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Google Contacts API</title>
</head>
<body>
<h2>Google Contacts API v3.0</h2>
<?php
require_once 'lib/google-api-client/autoload.php';
require 'lib/google-api-client/Config.php';
require 'lib/google-api-client/Google_Client.php';
$client_id = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbb.cccccccccccc.com';
$client_secret = 'oUe3fsfds4gfg23ha93kmKFkfgKZ';
$redirect_uri = 'http://ccccccccccccccccccc.com/rddddddddddd/index.php';
$client = new Google_Client();
$client -> setApplicationName('contact');
$client -> setClientid($client_id);
$client -> setClientSecret($client_secret);
$client -> setScopes('https://www.google.com/m8/feeds');
$client -> setRedirectUri($redirect_uri);
$client -> setAccessType('online');
if (isset($_GET['code'])) {
$client->authenticate();
$_SESSION['token'] = $client->getAccessToken();
header('Location: ' . $redirect_uri);
}
if(!isset($_SESSION['token']))
{
$url = $client->createAuthUrl();
echo '<a href="' . $url . '">Import Google Contacts</a>';
}else{
$client->setAccessToken($_SESSION['token']);
$token = json_decode($_SESSION['token']);
$token->access_token;
$curl = curl_init("https://www.google.com/m8/feeds/contacts/default/full?alt=json&max-results=50&access_token=" . $token->access_token);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$contacts_json = curl_exec($curl);
curl_close($curl);
$contacts = json_decode($contacts_json, true);
$return = array();
foreach($contacts['feed']['entry'] as $contact){
$return[] = array(
'name' => $contact['title']['$t'],
'email' => isset($contact['gd$email'][0]['address']) ? $contact['gd$email'][0]['address'] : false,
'phone' => isset($contact['gd$phoneNumber'][0]['$t']) ? $contact['gd$phoneNumber'][0]['$t'] :false,
);
}
var_dump($return);
}
?>
</body>
</html>
您似乎忘记将 code
传递给 authenticate
方法。这是 Google_Client.php
中 authenticate
方法的文档和实现:
/**
* Attempt to exchange a code for an valid authentication token.
* If $crossClient is set to true, the request body will not include
* the request_uri argument
* Helper wrapped around the OAuth 2.0 implementation.
*
* @param $code string code from accounts.google.com
* @param $crossClient boolean, whether this is a cross-client authentication
* @return string token
*/
public function authenticate($code, $crossClient = false)
{
$this->authenticated = true;
return $this->getAuth()->authenticate($code, $crossClient);
}
因此,如下更改代码很可能会解决问题:
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']); // <-- Add code parameter here
$_SESSION['token'] = $client->getAccessToken();
header('Location: ' . $redirect_uri);
}