Требуется ли секрет клиента для Google OAuth 2.0 с использованием потока авторизации PKCE? Должен ли я публично раскрывать секрет клиента?

Я запускаю приложение с открытым исходным кодом, которое работает в среде macOS. Я хочу реализовать синхронизацию контактов Google с ним, поэтому я реализовал поток авторизации «токена» OAuth 2.0 (неявный), чтобы пользователи могли дать согласие на доступ приложения к их контактам. Проблема с этим потоком заключается в том, что он не позволяет мне получить токен обновления для использования для добавочной/запланированной синхронизации без согласия пользователя.

Изучив его еще немного, я обнаружил, что для получения токена обновления мне нужно реализовать поток «кода» авторизации, который будет возвращать код в обратном вызове согласия, а затем я могу использовать этот код для получения токена обновления и токен доступа. Хоть и с предоставлением клиентской тайны. Проблема с этим потоком заключается в том, что мне нужно предоставить секрет клиента. Поскольку это приложение с открытым исходным кодом, я не решаюсь добавлять секрет моего клиента непосредственно в базу кода. Тем более, что учетные данные предоставляют доступ к приложению для получения согласия, которое также имеет разрешения на чтение и редактирование в Google Cloud Platform.

После некоторых дополнительных исследований я обнаружил, что существует поток PKCE, который можно добавить к потоку «кода» авторизации, и у меня сложилось впечатление, что мне не потребуется предоставлять секрет клиента, используя этот поток. Вместо этого я должен иметь возможность указать code_challenge при создании исходного URL-адреса OAuth, а затем его можно будет использовать позже для проверки запроса. Однако даже после внедрения запроса кода (PKCE) в поток я все равно получаю следующую ошибку при попытке получить токен доступа и токен обновления с использованием возвращенного «кода» из обратного вызова после потока согласия.

Я получаю сообщение об ошибке: "client_secret" is missing. Но у меня сложилось впечатление, что поток PKCE не требует секрета клиента... Итак, у меня есть несколько вопросов, на которые я не смог получить однозначный ответ при поиске SO:

  1. Безопасно ли публично раскрывать секрет клиента?
    • Я всегда предполагал, что нет, но, похоже, я не могу заставить этот поток работать иначе.
    • Я видел, как другие проекты с открытым исходным кодом раскрывали секрет клиента, но их согласие касалось менее конфиденциальных областей.
  2. Правильно ли я понимаю, что мне не нужен секрет клиента при использовании потока кода авторизации с PKCE?
    • Или мне все еще нужен секрет клиента, а PKCE (проверка кода) — это всего лишь дополнительный уровень безопасности?
  3. Есть ли другой поток/процесс, который мне следует использовать, при котором мне не нужно раскрывать секрет моего клиента, но который все же позволяет мне получить токен обновления?

Я знаю, что Google позволяет создавать учетные данные для UWP, iOS или Android, и я думаю, что они позволяют передавать код авторизации без секрета клиента, но только потому, что они связаны с конкретным идентификатором приложения/магазина на соответствующих платформах.

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

Является ли единственный способ сохранить секрет клиента в общедоступном исходном коде? Это вообще безопасно? Любая помощь очень ценится!

Заранее спасибо!

🤔 А знаете ли вы, что...
С Node.js можно легко интегрировать с базами данных, такими как MongoDB и MySQL.


54
1

Ответ:

Решено

Безопасно ли публично раскрывать секрет клиента?

В общем, не лучшая идея. В зависимости от объема секрета

Правильно ли я понимаю, что мне не нужен секрет клиента при использовании потока кода авторизации с PKCE?

Нет, вы не правы. PCKE решает другую проблему безопасности.

Есть ли другой поток/процесс, который мне следует использовать, при котором мне не нужно раскрывать секрет моего клиента, но который все же позволяет мне получить токен обновления?

Вы можете выполнить часть аутентификации на сервере, которым вы управляете.

Является ли единственный способ сохранить секрет клиента в общедоступном исходном коде? Это вообще безопасно? Любая помощь очень ценится!

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