Gmail API:权限不足

Fra*_*ssi 6 php email gmail google-api gmail-api

情况:

我正在为我的应用测试Gmail API.

我已经测试了一些请求,它们工作正常.例如获取消息,获取用户历史记录,获取草稿列表等.

基本上所有只读请求都正常工作.

我有一些与其他请求的权限相关的问题,例如当我必须写或删除草稿时.

这是我得到的错误:

(403) Insufficient Permission
Run Code Online (Sandbox Code Playgroud)

代码:

这是初始化应用程序的功能:

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;
}
Run Code Online (Sandbox Code Playgroud)

这是删除一个草稿的请求:

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' );
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我试图撤销权限并设置新凭据.初始化服务时声明的范围是:

https://mail.google.com/
Run Code Online (Sandbox Code Playgroud)

如文档中所述,授予对帐户的完全访问权限.

但我仍然得到同样的错误.以下请求的确切错误:

删除草稿 - 创建草稿 - 创建标签 - 删除消息

问题:

为什么我会收到这个错误?
它与缓存中的相同值存储有关吗?
或者与API的许可相关?

Joh*_*Mee 8

您需要" https://www.googleapis.com/auth/gmail.compose "来创建草稿.那么如果你发生了什么呢

$client->setScopes(array(
    'https://mail.google.com/',
    'https://www.googleapis.com/auth/gmail.compose'
));
Run Code Online (Sandbox Code Playgroud)

或者如果你想变得更正式

define('SCOPES', implode(' ', array(
  Google_Service_Gmail::MAIL_GOOGLE_COM,
  Google_Service_Gmail::GMAIL_COMPOSE)
));

$client->setScopes(SCOPES)
Run Code Online (Sandbox Code Playgroud)

或者有效的php可能是什么(我有一段时间没有做过php).

请注意,如果您已经拥有令牌,则可能需要执行一些健美操以撤消它,以便您可以使用添加的权限重新发布.这可能意味着删除文件,可能名为gmail.storage,或者,如果您有权访问帐户登录并转到https://security.google.com/settings/security/permissions,则可以手动撤消访问权限.

此链接可能相关:https: //developers.google.com/gmail/api/auth/scopes

通过源代码蜿蜒曲折可能具有启发性.

你可能能够在Python下用同样的东西从我的战斗中收集一些见解

  • 谢谢!我基本上把两个答案放在一起了。撤消并重新启用api是不够的。但是我创建了一个新帐户,并在文件quickstart.php中将Google_Service_Gmail :: GMAIL_READONLY替换为Google_Service_Gmail :: MAIL_GOOGLE_COM,Google_Service_Gmail :: GMAIL_COMPOSE。在我的应用中初始化api时,还要设置范围“ https://mail.google.com/”、“https://www.googleapis.com/auth/gmail.compose”。现在工作正常。 (2认同)