Как вызвать Google API из AWS Lambda (развернуто через Pulumi)
У меня есть простое веб-приложение, защищенное Google OAuth. Таким образом, пользователь должен войти в систему, используя свой аккаунт Google домена. Google отвечает токеном, который может использовать приложение. Он содержит электронную почту пользователя, имя и т. Д.
На серверном сервере находится AWS Lambda, который, в свою очередь, вызывает Google API. Сайт отправляет токен Google в AWS, который отправляет его в Google API в заголовке Authentication: Bearer ${token}
,
Проблема в том, что Google API всегда возвращает ошибку "Неверные учетные данные"
Я позаботился о том, чтобы область действия токена содержала доступ к данному API, так что, по моему мнению, он должен работать. Что мне не хватает?
PS: развертывание в AWS Infra реализовано в виде сценария Pulumi.
Пример кода для иллюстрации
const payload = JSON.stringify({ ... some object ... });
const options = {
host: 'www.googleapis.com',
path: '/admin/directory/v1/users',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': payload.length.toString(),
// Token is obtained from browser, but used in context of AWS lambda
'Authorization': `Bearer ${token.token_id}`
}
};
return new Promise(function (resolve, reject) {
try {
let body = new Array<Buffer>();
const request = https.request(options, function (res: any) {
if (res.statusCode != 200) {
reject(res.statusCode);
}
res.on('data', (data: any) => {
body.push(data);
// It seems that the 'request.on('end') is never fired
// I receive the data in the first batch, and that's it
resolve(data.toString());
});
});
request.on('end', () => {
console.error('Request ended');
// at this point, `body` has the entire request body stored in it as a string
let result = Buffer.concat(body).toString();
resolve(result);
});
request.on('error', async (err: Error) => {
console.error('Errooooorrrr request failed');
reject(err);
});
// Write the payload to the body of the request
if (payload) {
request.write(payload);
};
request.end();
}
catch (e) {
console.log('Something unexpected', e);
}
});