Как вызвать Google API из AWS Lambda (развернуто через Pulumi) - PullRequest
0 голосов
/ 23 января 2019

У меня есть простое веб-приложение, защищенное 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);
    }
});
...