Php Gmail API:权限不足
情况: 我正在为我的应用程序测试 我已经测试了一些请求,它们工作正常。 例如获取消息、获取用户历史记录、获取草稿列表等 基本上所有只读请求都可以正常工作 相反,我有一些与其他请求的权限相关的问题,例如,当我必须编写或删除草稿时 这是我得到的错误:Php Gmail API:权限不足,php,email,google-api,gmail,gmail-api,Php,Email,Google Api,Gmail,Gmail Api,情况: 我正在为我的应用程序测试 我已经测试了一些请求,它们工作正常。 例如获取消息、获取用户历史记录、获取草稿列表等 基本上所有只读请求都可以正常工作 相反,我有一些与其他请求的权限相关的问题,例如,当我必须编写或删除草稿时 这是我得到的错误: (403) Insufficient Permission 代码: 这是初始化应用程序的函数: public function gmail_init_service() { $client = new Google_Client();
(403) Insufficient Permission
代码:
这是初始化应用程序的函数:
public function gmail_init_service()
{
$client = new Google_Client();
$client->setApplicationName("Gmail API test");
$client->setDeveloperKey("MY_KEY");
$client->setClientSecret('MY_CLIENT_SECRET');
$client->SetClientId('MY_CLIENT_ID');
$client->setScopes(array('https://mail.google.com/'));
$client->setAccessToken('{"access_token":"MY_ACCESS_TOKEN","token_type":"Bearer","expires_in":3600,"refresh_token":"MY_REFRESH_TOKEN","created":1433502343}');
$service = new Google_Service_Gmail($client);
return $service;
}
这是删除一份草案的请求:
public function gmail_delete_draft()
{
$service = $this->gmail_init_service();
// --------------- Get draft list --------------
$list = $service->users_drafts->listUsersDrafts('me');
$draftList = $list->getDrafts();
// --------------- Get draft IDs ---------------
$inbox_draft = [];
foreach($draftList as $mlist)
{
$draftId = $mlist->id;
$optParamsGet2['format'] = 'full';
$single_message = $service->users_drafts->get('me', $draftId , $optParamsGet2);
$inbox_draft[]['draftId'] = $draftId;
$inbox_draft[]['draft'] = $single_message;
}
// --------------- Delete draft ---------------
$draft_delete = $service->users_drafts->delete('me', 'DRAFT_ID' );
}
编辑:
我已尝试撤消权限并设置新凭据。
初始化服务时声明的作用域为:
https://mail.google.com/
如文件中所述,允许完全访问该账户
但我还是犯了同样的错误。
以下请求的错误与此完全相同:
删除草稿-创建草稿-创建标签-删除邮件
问题:
为什么我会犯这样的错误?它与缓存中存储的相同值有关?
或者与API的权限有关?您需要
https://mail.google.com/
作为您可以删除邮件的范围。您需要“”来创建草稿。那么,如果你
$client->setScopes(array(
'https://mail.google.com/',
'https://www.googleapis.com/auth/gmail.compose'
));
或者如果你想变得更正式
define('SCOPES', implode(' ', array(
Google_Service_Gmail::MAIL_GOOGLE_COM,
Google_Service_Gmail::GMAIL_COMPOSE)
));
$client->setScopes(SCOPES)
或者不管有效的php是什么(我已经有一段时间没有使用php了)
注意如果您已经拥有令牌,您可能需要做一些练习来撤销它,这样您就可以使用添加的权限重新颁发令牌。这可能意味着删除一个文件,可能名为gmail.storage,或者,如果您有访问帐户的权限,则可以手动撤销登录和访问权限
此链接可能与以下内容相关:
一条蜿蜒的河流或许会给人启发
您可能会获得一些见解谢谢您的回复!我曾单独尝试过这个范围,并与前一个范围结合使用,但仍然得到了相同的错误,这一定是您所说的缓存问题。射击另一方面,我认为最好在应用程序启动时创建一次客户端,然后将$service变量传递给函数。转到并撤消对应用程序的访问(),然后重试:),但范围会根据请求号而更改吗?或者我可以使用所有的请求吗?请告诉我我需要帮助!我撤销了该页面的权限。我再次尝试激活应用程序,创建新的客户端ID、新密钥,并下载新的client_secret.json,并按照说明进行操作:但当我运行quickstart.php时,出现错误:令牌已被吊销。从那个页面上看,不再显示Gmail API了。我怎样才能再次授予许可?我不知道,对不起:(希望其他人能加入进来。你首先是如何获得access_令牌的?谢谢!我基本上已经把这两个答案放在了一起。撤销和重新启用api是不够的。但我已经创建了一个全新的帐户,在文件quickstart.php中,我用Google_服务\u Gmail::Gmail\u READONLY替换了Google_服务\u Gmail::MAIL\u GOOGLE\u COM、GOOGLE\u Service\u Gmail::Gmail\u COMPOSE。以及在我的应用程序中初始化api时设置作用域“”、“”。现在工作正常。