Gmail API 和 Google API 节点客户端出现错误 500 backendError

Posted

技术标签:

【中文标题】Gmail API 和 Google API 节点客户端出现错误 500 backendError【英文标题】:Error 500 backendError with Gmail API and Google APIs Node Client 【发布时间】:2014-08-22 18:22:03 【问题描述】:

我正在尝试将新的Gmail API 与Google API Node client 一起使用。我从开发者控制台创建了一个新项目,设置了一个新的“服务帐户”客户端 ID,并启用了对 API 的访问。

作为概念证明,我只是想在我的收件箱中列出线程。当我为 API explorer 启用 OAuth 2.0 切换并输入我的电子邮件地址时,请求成功并且我看到带有数据的 JSON 响应。

现在我尝试在 Node 中做同样的事情:

var googleapis = require('googleapis');

var SERVICE_ACCOUNT_EMAIL = '...SNIP...';

// generated by: openssl pkcs12 -in ...SNIP...p12 -out key.pem -nocerts -nodes
var SERVICE_ACCOUNT_KEY_FILE = 'key.pem';
var jwt = new googleapis.auth.JWT(
        SERVICE_ACCOUNT_EMAIL,
        SERVICE_ACCOUNT_KEY_FILE,
        null,
        ['https://www.googleapis.com/auth/gmail.readonly']);

googleapis
    .discover('gmail', 'v1')
    .execute(function(err, client) 

        jwt.authorize(function(err, result) 
            if(err) console.error(err);
            else console.log(result);

            client.gmail.users.threads.list()
                .withAuthClient(jwt)
                .execute(function(err, result) 
                    if(err) console.error(err);
                    else console.log(result);
            );
        );
    );

首先我打印authorize() 调用的结果,看起来它返回了一个令牌,所以我认为我已经正确设置了所有 OAuth 内容:

 access_token: '...SNIP...',
  token_type: 'Bearer',
  expires_in: 1404277946,
  refresh_token: 'jwt-placeholder' 

然后我尝试实际使用 API,但出现错误:

 errors: 
   [  domain: 'global',
       reason: 'backendError',
       message: 'Backend Error'  ],
  code: 500,
  message: 'Backend Error' 

在这一点上,我不知道还能尝试什么。我认为 OAuth 工作正常,因为我没有收到任何身份验证错误。我还认为 API 本身正在运行,我的帐户也很好,因为我可以通过 API Explorer 使用它。我也没有看到任何迹象表明 Node 库有问题。简而言之,我不知道问题是什么。有什么想法吗?

【问题讨论】:

【参考方案1】:

您正在使用服务帐户来验证您对 GMail 的请求。据我所知,您的服务帐户不会有 Gmail,只有用户有 Gmail。因此,您需要与用户 (see here for example) 一起执行 OAuth2 流程。

【讨论】:

嗯,这很有趣。我正在尝试做同样的事情 - 即使用带有 Gmail API 的 OAuth 2.0 服务帐户并且还遇到 500 后端错误。您是否有说明您不能将服务帐户与 GMail API 一起使用的来源?我以为因为这是通过用户的 Google Developer Console 创建的,所以它会与该用户相关联? 是的,它说here 身份验证是通过使用 OAuth 2.0 流程对用户进行身份验证来完成的,并描述了通过最终用户身份验证的一般身份验证流程: 1. 在开发期间,在 Google 中注册应用程序开发者控制台。 2. 应用启动时,请求用户授予访问其 Google 帐户中数据的权限。 3. 如果用户同意,您的应用程序会请求并接收访问 Gmail API 的凭据。 4. 刷新凭据(如有必要)。

以上是关于Gmail API 和 Google API 节点客户端出现错误 500 backendError的主要内容,如果未能解决你的问题,请参考以下文章

使用 gmail-api 和 google-api-php-client 发送电子邮件

如何使用 nodejs 下载 Gmail API 的附件?

如何使用 java 和 google gmail-api 获取收到的邮件? [关闭]

Google 工作区:通过 API 激活 gmail

在java中使用对象com.google.api.services.gmail.model.Message读取gmail消息正文?

Chrome 扩展程序和 gmail.js 阻止访问 google api