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时设置作用域“”、“”。现在工作正常。