【问题标题】:JWT google-auth-library - bad request (400, failedPrecondition)JWT google-auth-library - 错误请求(400,failedPrecondition)
【发布时间】:2018-06-27 16:06:29
【问题描述】:

我尝试通过 Google API/Jwt 授权(通过 google-auth-library)从 gmail 获取电子邮件。这是我的代码:

var google = require('googleapis');
var gmail = google.gmail('v1');
var key = require('../jwt.keys.json');

var jwtClient = new google.auth.JWT(
    key.client_email,
    null,
    key.private_key,
    ['https://mail.google.com/', 
    'https://www.googleapis.com/auth/gmail.readonly', 
    'https://www.googleapis.com/auth/gmail.modify', 
    'https://www.googleapis.com/auth/gmail.metadata']
);


jwtClient.authorize(function(err, tokens) {
    if (err) {
      console.log(err);
      return;
    }
    gmail.users.messages.list({
        auth: jwtClient,
        maxResults: 5,
        q: "",
        labelIds: ["INBOX"],
        userId: 'me',
    }, function(err, response) {
        if (err)
            return d.reject('The API returned an error: ' + err);

        //...


    });
});

我收到 gmail.users.messages.list 请求的下一个错误:

code: 400,
errors: [ 
    { domain: 'global',
       reason: 'failedPrecondition',
       message: 'Bad Request' 
    }] 

附: Gmail API 已启用。

谢谢!

【问题讨论】:

标签: gmail-api


【解决方案1】:

您不应将 JWT 用于 Gmail 等单用户应用程序,除非您拥有 G Suite(Google Apps for Work 域),并且该电子邮件帐户包含在其中。

服务帐户是他们自己的帐户,而不是 Gmail 帐户。它们适用于不需要用户的 API(例如地图、搜索)或当您使用 Google Apps for Work 域并希望为域中的所有用户启用委派时(由域管理员,因此您不需要个人用户授权)。

更详细的答案在这里:https://stackoverflow.com/a/29778137/6890794

您需要将 Oauth2 应用于您的工作流程,而不是 JWT。 https://developers.google.com/gmail/api/auth/web-server

【讨论】:

  • 如果您在另一个问题的答案中找到了解决方案,正确的做法是将此问题标记为可能与另一个问题重复。
  • 感谢您的回答,但据我所知,如果一台服务器调用另一台服务器的 api,则不可能使用 Oauth2 方法。这是我使用 JWT 的原因
  • @daniil_ 我认为这取决于您如何使用 Oauth2 方法。您可以使用developers.google.com/oauthplayground 1 次获得用户对您的应用的批准(您只需要一次),然后每次只使用刷新令牌来获取访问令牌。
猜你喜欢
  • 1970-01-01
  • 2012-08-21
  • 2022-11-12
  • 2016-11-06
  • 2011-06-21
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多