代码之家  ›  专栏  ›  技术社区  ›  daniil_

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

  •  1
  • daniil_  · 技术社区  · 7 年前

    我试图通过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。用户。信息。列表 请求:

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

    附笔。 Gmail API已启用。

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   sillicon    6 年前

    你不应该在Gmail这样的单用户应用程序中使用JWT,除非你有一个G套件(Google Apps for Work domain),并且其中有一个电子邮件帐户。

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

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

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