2015-06-22 4 views
1

Если я пытаюсь вызвать API GMail, я получаю следующее сообщение об ошибке в ответ:Как получить доступ к API GMail из моего собственного GMail?

{ 
    "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. Я попытался добавить больше GMail в консоль Google, и с 3-мя письмами, автоматически создаваемыми для проекта, только почта от Json вернет мне неудачное предварительное условие, если попробуйте другие письма, включая авто, созданные для проекта, и мой собственный GMail (владелец проекта GMail) ошибка 401 unautorized_client.

Или мне нужен другой "grant_type Используйте следующую строку, закодированную по URL-адресу: urn: ietf: params: oauth: grant-type: jwt-bearer"?

[email protected] 
[email protected]///this is de mail downloaded in json from credentials 
[email protected] 

(это на стороне сервера JS)

ответ

1

Проблема, кажется, с учетными данными OAauth. В консоли разработчика Google -> Учетные данные, когда вы пытаетесь получить новые учетные данные, есть 3 варианта: 1) Веб-приложение (это тот, который вы должны использовать). 2) Учетная запись службы (что я считаю, вы пытаетесь использовать право теперь), 3) Установленное приложение (для приложений для iOS &)

Также при аутентификации укажите, что вы будете пытаться получить доступ к содержимому службы в режиме «офлайн», что даст вам «токен обновления», чтобы сделать подчиненные запросы без участия пользователя.

Вы можете получить доступ к Google+, поскольку его общедоступные данные по сравнению с Gmail, где вы пытаетесь получить доступ к сообщениям для определенного пользователя (личные данные). Учетные записи учетной записи службы не дают вам доступа к личным данным пользователя, и вы должны олицетворять пользователя, чьи письма вы пытаетесь получить через аутентификацию, используя учетные данные веб-приложения в вашем случае.

Надеется, что это помогает ....

+0

Я использую optioon 2 'Service Account' и использую это руководство https://developers.google.com/identity/protocols/OAuth2ServiceAccount –

+0

@VictorManuel Используете домен Google App? Поскольку это единственный случай, когда вы можете получить доступ к личным данным пользователя через учетную запись службы, в противном случае вам нужно будет олицетворять пользователя посредством трехстороннего цикла OAuth, когда пользователь сначала перенаправляется на экран проверки подлинности Google по вашему сценарию, где пользователь вводит и предоставляет доступ к вашему приложению для просмотра его/ее сообщений. –

+0

Я постараюсь с 1) веб-приложением, ty –

1
"sub": client_email 

кажется неверными.

Вы должны использовать свой адрес gmail в подполе, поскольку вы пытаетесь олицетворять этот адрес электронной почты.

+0

Да, я попробую, с моей электронной почтой, другим почтовым адресом и 3 автоматически созданной почтой для консоли Google, только с «client_email» и без «sub» верните мне 200 ok, если я попробую с возвратом gmail «Неавторизованный клиент» –

+0

Вы также предоставили полномочия домена домена учетной записи службы в консоли администратора Google? Вам также необходимо использовать адрес электронной почты из этого домена в подполе. – ND003

+0

У меня нет домена, я попробую использовать параметр веб-приложения для доступа, –

Смежные вопросы