Google OAuth v2.0 генерирует неверный JWT

Мы переносим наш существующий логин Javascript Google в новую библиотеку Google OAuth, как указано в уведомлении об устаревании здесь — https://developers.googleblog.com/2021/08/gsi-jsweb-deprecation.html.

Мы следуем это руководство, и наш код javascript выглядит следующим образом:

const client = google.accounts.oauth2.initTokenClient({
    client_id: <our-client-id>,
    scope: 'https://www.googleapis.com/auth/userinfo.email \
            https://www.googleapis.com/auth/userinfo.profile',
    callback: (tokenResponse: any) => {
        if (tokenResponse && tokenResponse.access_token) {
            if (google.accounts.oauth2.hasGrantedAllScopes(tokenResponse,
                'https://www.googleapis.com/auth/userinfo.email',
                'https://www.googleapis.com/auth/userinfo.profile')) {
                
                console.log(tokenResponse.access_token );

                .. further auth logic
                 
            }
        }
    }
});
client.requestAccessToken();

Все работает нормально в том смысле, что я могу получить токен из Google, за исключением того, что похоже, что токен JWT, сгенерированный новой библиотекой, недействителен. Точнее, он не соответствует спецификации токена JWT — токен не состоит из 3 частей (заголовок/полезная нагрузка/подпись) и слишком короткий (это означает, что он, вероятно, не несет все данные, которые должен). Он также не проходит проверку в https://jwt.io/.

Позвольте мне показать вам пример.

  1. Токен, сгенерированный предыдущей версией библиотеки:

    eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg2MTY0OWU0NTAzMTUzODNmNmI5ZDUxMGI3Y2Q0ZTkyMjZjM2NkODgiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy<...>1MWMifQ.OgOOhbTTbLYzcxNhNdvozf1<...>4bRLT3DILyWeO1FX64WaabGRjCR2amQ

  2. Токен, сгенерированный новой библиотекой:

    ya29.A0ARrdaM_hHsX50Qim6c1NudaZvv6qMpMkbNxW-ltOh49s6U4JKZNvPJV3d0TAE_rqqvkvVG2983ryewiufhdsklKGiH-vEdIs7u2389iwek-dcgkY1SE-b21g0932oiweKT-HAYTJJ

Таким образом, проблема заключается в том, что новая версия библиотеки не возвращает правильный токен JWT (как описано выше). Мы не можем использовать этот новый токен ни для чего, поскольку мы не можем проверить его целостность (кто его выдал, соответствует ли секрет токена идентификатору нашего приложения, когда истекает срок действия токена и т. д.).

Я также пытаюсь проверить это, используя собственную конечную точку отладки OAuth Google, но она также жалуется, что второй токен недействителен:

https://oauth2.googleapis.com/tokeninfo?id_token=ya29.A0ARrdaM_hHsX50Qim6c1NudaZvv....

Примечание. Поскольку JWT содержит некоторые частные данные, я удалил закодированную в base64 часть первого токена (часть после первой точки и до второй точки), так же, как и третью часть (после второй точки). Так как я не могу понять последний токен, я также заменил там некоторые символы, но это не должно повлиять на демонстрацию этой проблемы.

Кто-нибудь сталкивался с подобным? У нас есть существующий набор проектов, которые необходимо перенести в новую библиотеку JS, но, похоже, она просто не работает. Я попытался создать новый проект с нуля, просто чтобы увидеть, затрагивает ли проблема каким-то образом только старые проекты, но безуспешно — Google OAuth возвращает тот же сломанный токен при использовании нового метода.

Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Токены доступа Google OAuth — это нет JWT. Это непрозрачные двоичные значения, означающие, что вы не можете напрямую извлечь информацию из токена. Google, однако, может искать токен в своих системах.

Вы можете проверить токен доступа Google OAuth, вызвав эту конечную точку:

curl -H 'Authorization: Bearer $ACCESS_TOKEN' https://www.googleapis.com/oauth2/v3/tokeninfo

Дополнительная информация о токенах, созданных на основе идентификаторов пользователей:

curl -H 'Authorization: Bearer $ACCESS_TOKEN' https://www.googleapis.com/oauth2/v3/userinfo

Если токен недействителен, запрос завершится ошибкой.

Возвращаемая информация будет в формате JSON с описанием токена.

Другие вопросы по теме