Почему Google Oauth verifyIdToken (версия javascript nodejs) не использует client-secret?

Я тестирую Google Singin для приложения SPA js+nodejs. Я добавил это:

<script src="https://apis.google.com/js/platform.js" async defer></script>

и эти:

<meta name="google-signin-client_id" content="YOUR_CLIENT_ID.apps.googleusercontent.com">
<div class="g-signin2" data-onsuccess="onSignIn"></div>

в html5/js клиентской части. следуя этому руководству:

https://developers.google.com/identity/sign-in/web/sign-in

когда пользователи аутентифицируются, библиотека получает токен и передает его на сервер, как описано здесь:

https://developers.google.com/identity/sign-in/web/backend-auth

на стороне сервера (nodejs) токен проверяется с помощью этой функции:

client.verifyIdToken(
    token,
    CLIENT_ID,
    // Or, if multiple clients access the backend:
    //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3],
    function(e, login) {
      var payload = login.getPayload();
      var userid = payload['sub'];
      // If request specified a G Suite domain:
      //var domain = payload['hd'];
    });

МОЙ ВОПРОС: когда используется client_secret? так как я использовал интерфейс CLIENT_ID для получения токена авторизации от Google, то я использовал сторону сервера CLIENT_ID для проверки токена. Я подумал, что токен мог быть проверен с использованием client_secret (то есть SECRET), известного только на стороне сервера, чтобы никто другой, получивший токен, не мог авторизовать этого пользователя. Что мне не хватает?

1 ответ

Решение

Создается впечатление, что созданный вами клиент является публичным клиентом, а секретный клиент используется в частном клиенте.

Изменить: я сожалею, что я использовал термин частный клиент вместо конфиденциального клиента. В основном у нас есть 2 типа клиентов в Oauth2

  1. Публичные клиенты:- Это клиенты, которым не нужен секрет клиента.

  2. Частные клиенты:- Эти клиенты имеют секрет Клиента.

Я не могу дать вам очень точный ответ относительно того, почему вы не видите своего клиентского секрета, поскольку я раньше не работал с этими конкретными библиотеками, однако мне кажется, что, возможно, вы создали публичного клиента вместо Конфиденциальный.

Я верю, что знаю ответ

См. Здесь: https://firebase.google.com/docs/auth/admin/verify-id-tokens

Он объясняет, как проверить подпись JWT самостоятельно (если хотите), и это также то, что google-auth-libraryделается. Внутри библиотеки найдитеverifySignedJwtWithCertsAsync() Внутри oauth2client.js. Google обрабатывает подписание JWT, используя собственный закрытый ключ во время процесса федеративного входа. К тому времени, когда JWT будет возвращен вам и отправлен в библиотеку аутентификации, он уже будет подписан. Это здорово, потому что вам никогда не нужно прикасаться к закрытому ключу. Он надежно хранится в Google, вы просто позволяете Google обрабатывать эту часть. Затем, когда вы отправляете JWT на свой сервер, утверждение идентификатора ключа в заголовке позволяет библиотеке auth знать, какой открытый ключ использовать для его декодирования. Если открытый ключ не может его расшифровать, значит аутентификация не удалась.

Наконец, убедитесь, что токен ID был подписан закрытым ключом, соответствующим дочернему требованию токена. Возьмите открытый ключ с https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com и используйте библиотеку JWT для проверки подписи. Используйте значение max-age в заголовке Cache-Control ответа от этой конечной точки, чтобы знать, когда обновлять открытые ключи.

Если все вышеперечисленные проверки прошли успешно, вы можете использовать тему (под) токена идентификатора в качестве uid соответствующего пользователя или устройства.

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