我正在开发一个使用Gmail API从gmail读取电子邮件的PHP。
基本上我就像快速入门页面一样(https://developers.google.com/gmail/api/quickstart/php)。
首先我加载客户端:
require __DIR__ . '/Google/vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfigFile(__DIR__ . '/client_secret.json');
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->setScopes(Google_Service_Gmail::MAIL_GOOGLE_COM);
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/index.php');
然后,如果我从使用我的应用程序中的用户ID存储的数据库加载凭据。 如果凭证不存在,我将重定向作为文档sais:
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
授权后,我使用google在我的重定向网址<:p>上提供的代码获取访问令牌
$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
//storing the data in the db
header('Location: /index.php');
当然,如果令牌过期,我会在身份验证过程中进行刷新:
if($client->isAccessTokenExpired()) {
$refreshToken = $client->getRefreshToken();
$client->fetchAccessTokenWithRefreshToken($refreshToken);
$newToken = $client->getAccessToken();
$newToken['refresh_token'] = $refreshToken;
//store the new token
}
所以在此之后我可以访问我的用户的电子邮件列表,它完美地运行。 问题是,如果我使用我的帐户登录,我会看到正确的电子邮件,但在与其他用户登录其他帐户后,我会在两个帐户中看到相同的电子邮件。
因此,例如,如果我为用户1授权帐户smith@gmail.com,那么对于用户2,电子邮件seth@gmail.com,在这两种情况下我都会看到相同的电子邮件(来自smith@gmail.com) )。
我已经检查过问题是否是我的,所以如果加载的访问令牌是相同的,但不幸的是,访问令牌是不同的。
另一个疯狂的事情是,如果我刷新第二个帐户(smith@gmail.com)的令牌,我会看到正确的电子邮件,但现在,将会看到史密斯电子邮件。
发生了什么事?我错过了什么?
更新
我已经尝试了每一步,问题是访问令牌,我也在另一台服务器上尝试过,但两者都返回相同的电子邮件。
我也尝试使用seth@gmail.com获取身份验证代码并手动检索访问令牌:
$token = $client->fetchAccessTokenWithAuthCode($code);
但是没办法,也是这样,它会继续认证我作为另一封电子邮件。
更新
事情变得越来越陌生,我试图删除配置文件的所有部分,并且只有在我必须检索身份验证代码时才使用它。
因此,在请求中我只传递了访问令牌数组,发生的情况是我可以看到电子邮件也完全删除了访问令牌,所以基本上客户端在请求时看起来是空的。
(
[auth:Google_Client:private] =>
[http:Google_Client:private] =>
[cache:Google_Client:private] =>
[token:Google_Client:private] => Array
(
[access_token] => no token what so eva
)
[config:Google_Client:private] => Array
(
[application_name] =>
[base_path] => https://www.googleapis.com
[client_id] =>
[client_secret] =>
[redirect_uri] =>
[state] =>
[developer_key] =>
[use_application_default_credentials] =>
[signing_key] =>
[signing_algorithm] =>
[subject] =>
[hd] =>
[prompt] =>
[openid.realm] =>
[include_granted_scopes] =>
[login_hint] =>
[request_visible_actions] =>
[access_type] => online
[approval_prompt] => auto
[retry] => Array
(
)
)
[logger:Google_Client:private] =>
[deferExecution:Google_Client:private] =>
[requestedScopes:protected] => Array
(
)
)
答案 0 :(得分:1)
我通过将客户端库更新到最新版本来解决这个问题。