Проверьте JWT из Google POST-запроса - PullRequest
1 голос
/ 16 апреля 2019

У меня есть бот в NodeJS, подключенный к Google Chat с использованием конечных точек HTTP.Я использую экспресс для получения запросов.Мне нужно убедиться, что все запросы поступают от Google, и хочу сделать это с помощью токена на предъявителя, который Google отправляет вместе с запросами.

Моя проблема в том, что я изо всех сил пытаюсь найти способ проверить токены.

Я захватил токен и попытался выполнить GET: https://oauth2.googleapis.com/tokeninfo?id_token=ey... (где ey ... - начало токена).

Что возвращает:

    "error": "invalid_token",
    "error_description": "Invalid Value"
}

Я попробовал то, что рекомендует Google:

var token = req.headers.authorization.split(/[ ]+/);
client.verifyIdToken({
    idToken: token[1],
    audience: JSON.parse(process.env.valid_client_ids)
}).then((ticket) => {
    gchatHandler.handleGChat(req.body, res);
}).catch(console.error);

И получил следующую ошибку:

Ошибка: не найден pem для конверта: {"alg": "RS256", "kid":" d ... 1 "," typ ":" JWT "}

Есть идеи, куда мне отправиться отсюда?

Редактировать: https://www.googleapis.com/service_accounts/v1/metadata/x509/chat@system.gserviceaccount.com нашел это,исследуя, как его использовать.Ребенок соответствует тому, что я получаю.

1 Ответ

1 голос
/ 16 апреля 2019

Разобрался, в конце концов.

Вам нужно нажать: https://www.googleapis.com/service_accounts/v1/metadata/x509/chat@system.gserviceaccount.com, чтобы получить файл JSON, содержащий ключи, связанные с их KID.

Затем, когда приходит запрос, используйте jsonwebtoken (NPM) для декодирования токена и извлечения KID из заголовка.

Используйте KID, чтобы найти соответствующий открытый ключ в ответе на вышеуказанном веб-сайте, а затем используйте функцию проверки, чтобы убедиться, что токен соответствует открытому ключу.

Вам также необходимо передать параметры аудитории и эмитента, чтобы подтвердить, что ваша конкретная учетная запись службы поражает бота.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...