#jwt #google-oauth #access-token #service-accounts #preconditions
Вопрос:
Я пытаюсь создать JWT, чтобы получить токен доступа для учетной записи службы Gmail для использования в сценарии предварительного запроса почтальона. Но я получаю ниже возврата после запуска https://oauth2.googleapis.com/token:
{
"access_token": "ya29.c.KqMBDQikl6jLqi-sFp0UlCB17UYVDrIakjYL5c4JKjQWYwOqRchLVLXl4VzYI6_MuRoH2rT7LESJgWyCD7jZsR1uOxzfNcWT3vivjsY7DjhMuOK8UQweuA9Ay2w_mqk-JjM7U8dXGhMVtah9aTxrI-ibdDL8e3TcmIW9xWL1Ep5vFwWGB8qV2XGA7ZkhA7PDT06FxQMIRieub628t-DiNTDM1VaxBw.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
"expires_in": 3599,
"token_type": "Bearer"
}
Это похоже на маркер полного доступа, и поле области не возвращается.
Сценарий предварительного запроса, который я использую, я загружаю с http://kjur.github.io/jsrsasign/jsrsasign-latest-all-min.js.
var navigator = {};
var window = {};
eval(pm.environment.get("jsrsasign-js"));
console.log(KJUR)
var scope = pm.environment.get('scope');
var iss = pm.environment.get('iss');
var privateKey = pm.environment.get('privateKey');
const header = {"alg" : "RS256", "typ" : "JWT"};
const claimSet =
{
"iss": iss,
"scope": scope,
"aud":"https://oauth2.googleapis.com/token",
"exp":KJUR.jws.IntDate.get("now 1hour").toString(),
"iat": KJUR.jws.IntDate.get("now").toString()
}
var jwt = KJUR.jws.JWS.sign(null, header, claimSet, privateKey);
pm.environment.set('jwt', jwt);
Когда я совершаю вызов API Gmail с возвращенным маркером доступа, например https://www.googleapis.com/gmail/v1/users/:user_mailbox/messages, он возвращается,
{
"error": {
"code": 400,
"message": "Precondition check failed.",
"errors": [
{
"message": "Precondition check failed.",
"domain": "global",
"reason": "failedPrecondition"
}
],
"status": "FAILED_PRECONDITION"
}
}
Гуру,
Не могли бы вы помочь проверить, в чем проблема и как ее устранить? Спасибо.
Комментарии:
1. Вам следует проверить исходный код для google api node.js клиентская библиотека это может дать вам некоторые подсказки о том, как они управляют аутентификацией учетной записи службы. Вы также найдете ряд вопросов, подобных этому, на SO, я еще не видел ни одного, где бы кто-нибудь заставил это работать.