JWT google-auth-library - 错误请求(400,failedPrecondition)

时间:2018-01-18 14:37:22

标签: gmail-api

我尝试通过Google API / Jwt authorizaton(通过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' 
    }] 

P.S。 Gmail API已启用。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

  

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

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

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