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

How to access GMail API from my own GMail?

本文关键字:GMail 访问 API 自己的 我自己      更新时间:2023-09-26

如果我试图调用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的坏请求。但如果我使用不同的范围,例如Google+,我会得到200 ok

我认为错误是"sub":client_email。我尝试在谷歌控制台中添加更多的GMail,并且有3封邮件是为该项目自动创建的,如果尝试其他邮件,包括为项目自动创建和我自己的GMail(项目的GMail所有者)错误为401 unatorized_client,只有Json的邮件返回我失败的前提条件。

或者我需要其他"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)

您的OAauth凭据似乎有问题。在谷歌开发者控制台->凭据,当你试图获得新的凭据时,有3个选项,1)Web应用程序(这是你应该使用的)2)服务帐户(我相信你现在正在尝试使用),3)已安装的应用程序(适用于iOS和安卓应用程序)

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

你可以访问Google+,因为它的公共数据与你试图访问某个用户的邮件的Gmail(私人数据)相比。服务帐户凭据不会允许您访问用户的私人数据,在您的情况下,您必须使用Web应用程序凭据模拟您试图通过身份验证访问其电子邮件的用户。

希望这能有所帮助。。。。

"sub": client_email

似乎不正确。

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