当前位置: 首页 > 知识库问答 >
问题:

Gmail API:权限不足

尉迟鑫鹏
2023-03-14

情况:

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

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

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

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

这是我得到的错误:

(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的权限有关?

共有2个答案

穆英飙
2023-03-14

您需要<代码>https://mail.google.com/作为您可以删除邮件的范围。

乐正乐湛
2023-03-14

您需要'https://www.googleapis.com/auth/gmail.compose'创建草稿。那么如果你

$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。存储,或者,如果您有权访问帐户登录并https://security.google.com/settings/security/permissions可以手动吊销访问权限。

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

通过源代码的曲折可能会有所启发。

您也许可以从我在Python下与这类事情的斗争中获得一些见解

 类似资料:
  • 我的Firestore数据库有一些用户和一些s。如果没有其他人认领,用户可以认领。他们通过在上创建一个文档来声明,该文档有一个名为的字段,该字段是对他们自己的用户文档的引用。 我想我已经在这些安全规则中捕捉到了: 但是,当为所有权删除文档时,我获得了: 我是这样做的: 如果我打开read和write设置为true的文档,就不会出现此异常。 我的规则怎么了?他们用模拟器测试正常。

  • 我只是因为将liquibase作为依赖项而收到了这个错误消息 原因:liquibase.exception.数据库异常: ORA-01031:权限不足[失败SQL:(1031)CREATE TABLE MYSCHMA. DATABASE CHANGELOGLOCK(ID INTEGER Not NULL, LOCKED NUMBER(1)Not NULL, LOCKGRANTED TIMESTAM

  • 我有以下规则: 所以基本上,我希望经过身份验证的用户能够读/写和集合。但当我创建一个用户并登录时,我会尝试写: 但我有一个错误: 不知道我做错了什么。任何帮助都将不胜感激——谢谢!

  • 我在自学firestore,我想不出一种方法,只允许用户更新、删除或阅读他们添加的集合。 我使用firebase auth进行用户处理。对于每个集合,我将作为保存在数据库中。 这是我的规矩 当我试图读取/获取数据时,我得到错误。 我正在使用firestore的web api(JavaScript)。这是我用来读取数据的代码。

  • 我的Dockerfile配置: 报错信息: 我已经尝试过以下几种方法: Dockerfile配置中添加RUN chmod -R 777 /yice Dockerfile配置添加 USER root,它会报: 找不Chrome,然后因为ghcr.io/puppeteer/puppeteer:latest镜像切换的用户名为pptruser,所以我手动在代码里给puppeteer配置executable

  • 我编写了一些与默认规则完美配合的代码。代码如下: 但如果我用这些规则 我明白了 我做错了什么?