我在多个页面上使用Google API时遇到问题。谷歌的例子运行良好,但所有代码都在一个页面上。
我有两页。第一个页面,用户点击登录按钮,第二个页面,我使用谷歌api提取用户信息。
首页:
<?php
########## Google Settings.. Client ID, Client Secret from https://cloud.google.com/console #############
$google_client_id = 'myid';
$google_client_secret = 'mysecret';
$google_redirect_url = 'http://www.myWebsite.com/secondPage.php'; //path to your script
$google_developer_key = 'mydeveloperkey';
//include google api files
require_once '../includes/Google/autoload.php';
//start session
session_start();
$client = new Google_Client();
$client->setClientId($google_client_id);
$client->setClientSecret($google_client_secret);
$client->setRedirectUri($google_redirect_url);
$client->addScope("https://www.googleapis.com/auth/drive");
$client->addScope("https://www.googleapis.com/auth/calendar");
$client->addScope("https://www.googleapis.com/auth/gmail.compose");
$client->addScope("https://www.googleapis.com/auth/plus.me");
$drive_service = new Google_Service_Drive($client);
$calendar_service = new Google_Service_Calendar($client);
$gmail_service = new Google_Service_Gmail($client);
/************************************************
If we're logging out we just need to clear our
local access token in this case
************************************************/
if (isset($_REQUEST['logout'])) {
unset($_SESSION['access_token']);
}
// Authenticating the aunthentication URL. and starting session
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['secondPage.php'];
header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}
/************************************************
If we have an access token, we can make redirect to secondPage.php, else we generate an authentication URL.
************************************************/
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
header("Location: http://www.myWebsite.com/secondPage.php");
die();
} else {
$authUrl = $client->createAuthUrl();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<a href="<?php echo $authUrl; ?>"> <img src="images/google-login-button.png" alt="Click to login"></a>
</body>
</html>
secondPage.php:
<?php ob_start() ?>
<?php
//include google api files
require_once '../includes/Google/autoload.php';
//start session
session_start();
$client = new Google_Client();
/************************************************
If we have an access token, we can make
requests, else we redirect to firstPage.php.
************************************************/
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
} else {
header("Location: http://www.myWebsite.com/firstPage.php");
die();
}
// Rest is HTML
由于某种原因,如果secondPage.php上的语句导致false,而其他语句则将其重定向回firstPage.php。
我对编程很陌生,我很确定我在做一些没有意义的事情。请告诉我是否应该添加更多信息。回答问题时,请尽量回答以下问题:
- 我必须在每个页面上创建单独的Google_client对象吗
- 我可以通过从会话变量设置access_token来创建Google_client对象吗
- 我应该如何划分代码,以便在firstPage.php上只有一个登录按钮,所有其他页面都可以使用access_token来使用谷歌服务
- 除了firstPage.php和secondPage.php,我还会在其他页面使用googleapi
1。正确重定向
我确实对这条线有一些疑问:
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['secondPage.php'];
这是因为我很确定,$_SERVER['secondPage.php']
变量后面没有任何设置。您应该修复此问题以重定向到secondPage.php
,然后不需要在第一页中添加更多代码。
2.在secondPage.php
中设置帐户
在你的第一个脚本中,你有这样的行:
$client = new Google_Client();
$client->setClientId($google_client_id);
$client->setClientSecret($google_client_secret);
$client->setRedirectUri($google_redirect_url);
你已经在secondPage.php
中提交了它们。这可能是您的第二个脚本不起作用的原因,因为您的脚本不知道它使用的是哪个帐户。您必须在第二个脚本中再次配置您的脚本,就像在第一个脚本中一样。同样,现在我会切断ob_start()
,它可能会加强调试。
我更希望你再次仔细阅读谷歌存储库上的那个例子。它很不言自明,只需要你一遍又一遍地读,只要你会有那种奇怪的小感觉。。。我可以向您保证,您可以在三个文件中轻松而干净地完成这项工作:第一个文件用于::authenticate()
并设置$_SESSION
,第二个用于::setAccessToken()
和所有其他文件,第三个文件的所有$client
类都由之前的两个文件使用。