Требуется ли секрет клиента для 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, и я думаю, что они позволяют передавать код авторизации без секрета клиента, но только потому, что они связаны с конкретным идентификатором приложения/магазина на соответствующих платформах.

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

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

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

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

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

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

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

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

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

Спасибо! Похоже, что для моего конкретного приложения невозможно получить токен обновления, не раскрывая секрет клиента. Тем более, что области, к которым он предоставляет доступ, считаются конфиденциальными. Это FOSS, поэтому я делаю все возможное, чтобы не требовать каких-либо внешних серверов, управляемых разработчиками.

Zach the Dev 27.06.2024 15:13

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