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

如何从我自己的GMail访问GMail API?

易流觞
2023-03-14

如果我尝试调用GMail API,我会得到以下错误:

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

首先我生成一个代币

var sHead = JSON.stringify({
    "alg": "RS256",
    "typ": "JWT"
});
var iat = timeStampf();
var exp = iat + 3600;
var sPayload = JSON.stringify({
    "iss": client_email,
    "sub": client_email,
    "scope": "https://mail.google.com/",
    "aud": "https://www.googleapis.com/oauth2/v3/token",
    "exp": exp,
    "iat": iat
});
var sJWS = KJUR.jws.JWS.sign("RS256", sHead, sPayload, private_key);
var paramstoken = "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=" + sJWS


getToken("POST", "/oauth2/v3/token", paramstoken, jsonData, replier);
/*rest petition
return 200 ok {
    "access_token": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M",
    "token_type": "Bearer",
    "expires_in": 3600
}
*/

接下来我测试令牌

function testToken(accessToken, replier) {
    var client = vertx.createHttpClient().host(urlbase).port(443).ssl(true).maxPoolSize(10);
    var request = client.request("GET", "/gmail/v1/users/me/messages", function(resp) {
        console.log('server returned status code: ' + resp.statusCode());
        console.log('server returned status message: ' + resp.statusMessage());
        resp.bodyHandler(function(body) {
            replier(JSON.parse(body.toString()));
        });
    });
    request.headers()
        .set("Content-type", contentType)
        .set("Authorization", "Bearer " + accessToken);
    request.end();
    client.close();
}

我得到一个错误400错误的请求作为回报。但如果我使用不同的范围,例如谷歌,我会得到200 ok。

我认为错误是“sub”:客户的电子邮件。我尝试在谷歌控制台中添加更多的GMail,有3封邮件是自动为项目创建的,只有来自Json的邮件返回我失败,如果尝试其他邮件,包括自动为项目创建的邮件和我自己的GMail(项目的GMail所有者)错误是401 Unauthorized_client。

或者我需要其他“grant_type使用以下字符串,URL根据需要编码:urn:ietf:params:oauth:grant type:jwt bearer”?

de13@appspot.gserviceaccount.com
7686@developer.gserviceaccount.com///this is de mail downloaded in json from credentials
768-compute@developer.gserviceaccount.com

(这是服务器端js)

共有2个答案

王锐
2023-03-14
"sub": client_email

似乎是不正确的。

您应该在子字段中使用您的gmail地址,因为您正在尝试模拟此电子邮件地址。

松鸣
2023-03-14

您的OAauth凭据似乎有问题。在谷歌开发者控制台上-

此外,在进行身份验证时,请注意,您将尝试以“脱机”模式访问服务内容,这将为您提供一个“刷新令牌”,以便在不需要用户参与的情况下发出后续请求。

您可以访问谷歌,因为它的公共数据与您试图访问某个用户的邮件(私人数据)的Gmail相比。服务帐户凭据不会让您访问用户的私人数据,您必须模拟您试图通过身份验证访问其电子邮件的用户。

希望这有帮助......

 类似资料:
  • 问题内容: 我需要一个允许我使用Java在Gmail中进行电子邮件操作(例如,发送/接收邮件)的库。 问题答案: 您是否看到过Java的g4j-GMail API? GMailer Java版API(g4j)是一组API,允许Java程序员与GMail进行通信。借助G4J,程序员可以制作基于GMail大量存储的基于Java的应用程序。

  • 问题内容: 是否可以从函数范围内访问python函数对象属性? 例如让我们 现在,如果要返回_x属性内容“ foo”,则必须是什么?如果有可能(简单) 谢谢 更新: 我也想做以下工作: 更新2: 声明不可能(如果是这种情况),以及为什么,比提供一种方法来伪造它更令人满意,例如使用不同于函数的对象 问题答案: 解 使函数的默认参数之一成为对函数本身的引用。 用法示例: 说明 原始张贴者想要一种不需要

  • 我希望在我的服务器/笔记本电脑上运行一个简单的过程,每天一次将文件上传到我的Google驱动器。我不希望分享这个,允许其他用户使用它等。 我发现的所有示例似乎都涉及浏览到一个地址以获得用户(我)的许可,然后获取身份验证代码等并继续 参考: Java 快速入门 有没有一种方法/示例可以在不需要浏览器的情况下执行此操作,每次获得权限以获取唯一的身份验证代码,因为我只想为我的帐户执行此操作? 我可以将

  • 问题内容: 目标是可以轻松访问任何级别的SwiftUI视图层次结构的托管窗口。目的可能有所不同- 关闭窗口,退出第一响应者,替换根视图或contentViewController。与UIKit / AppKit集成有时也需要通过窗口的路径,因此… 我在这里遇到和尝试过的 像这样的东西 或通过在每个SwiftUI视图中添加UIViewRepresentable / NSViewRepresentab

  • 本文向大家介绍如何使用自己的原型访问JavaScript对象?,包括了如何使用自己的原型访问JavaScript对象?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过使用名为“ Object.create() ”的javascript方法创建自己的原型来访问现有对象。使用此方法,我们可以将属性从现有属性继承到新创建的原型。让我们简要地讨论一下。 语法 此方法采用现有对象并创建自己的原型,以便

  • 问题内容: 在unittest的setUp()方法中,我设置了一些 自 变量,稍后将在实际测试中引用它们。我还创建了一个装饰器来进行一些日志记录。有没有一种方法可以从装饰器访问这些 自 变量? 为了简单起见,我将发布此代码: 什么是访问的最好办法 一个 从装饰(()在设置中设定)? 问题答案: 由于您正在装饰一个方法,并且是一个方法参数,因此装饰器可以在运行时访问。显然不是在解析时,因为还没有对象