如果我尝试调用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分。
我认为错误是'“sub”:client_email'。我尝试在Google控制台中添加更多GMails,并为项目自动创建3封邮件,只有来自Json的邮件返回我失败的前提条件,如果尝试使用其他邮件,包括为项目自动创建和我自己的GMail(项目的GMail所有者)错误是401 unautorized_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)
答案 0 :(得分:1)
您的OAauth凭据似乎存在问题。在Google Developer Console上 - >凭据,当您尝试获取新凭据时,有3个选项,1)Web应用程序(这是您应该使用的那个)2)服务帐户(我相信您现在正在尝试使用),3)已安装应用程序(适用于iOS和Android应用程序)
同时在进行身份验证时,请注意您将尝试访问“离线”中的服务内容。模式,它会给你一个刷新令牌'在没有用户参与的情况下提出后续请求。
您可以访问Google+,因为与您尝试访问特定用户的邮件的Gmail相比,其公开数据(私人数据)。服务帐户凭据不允许您访问用户的私人数据,并且您必须使用您的案例中的Web应用程序凭据模拟您尝试访问其电子邮件的用户。
希望这会有所帮助......
答案 1 :(得分:1)
"sub": client_email
似乎不正确。
您应该在子字段中使用您的Gmail地址,因为您正在尝试模拟此电子邮件地址。