Я запускаю приложение с открытым исходным кодом, которое работает в среде macOS. Я хочу реализовать синхронизацию контактов Google с ним, поэтому я реализовал поток авторизации «токена» OAuth 2.0 (неявный), чтобы пользователи могли дать согласие на доступ приложения к их контактам. Проблема с этим потоком заключается в том, что он не позволяет мне получить токен обновления для использования для добавочной/запланированной синхронизации без согласия пользователя.
Изучив его еще немного, я обнаружил, что для получения токена обновления мне нужно реализовать поток «кода» авторизации, который будет возвращать код в обратном вызове согласия, а затем я могу использовать этот код для получения токена обновления и токен доступа. Хоть и с предоставлением клиентской тайны. Проблема с этим потоком заключается в том, что мне нужно предоставить секрет клиента. Поскольку это приложение с открытым исходным кодом, я не решаюсь добавлять секрет моего клиента непосредственно в базу кода. Тем более, что учетные данные предоставляют доступ к приложению для получения согласия, которое также имеет разрешения на чтение и редактирование в Google Cloud Platform.
После некоторых дополнительных исследований я обнаружил, что существует поток PKCE, который можно добавить к потоку «кода» авторизации, и у меня сложилось впечатление, что мне не потребуется предоставлять секрет клиента, используя этот поток. Вместо этого я должен иметь возможность указать code_challenge
при создании исходного URL-адреса OAuth, а затем его можно будет использовать позже для проверки запроса. Однако даже после внедрения запроса кода (PKCE) в поток я все равно получаю следующую ошибку при попытке получить токен доступа и токен обновления с использованием возвращенного «кода» из обратного вызова после потока согласия.
Я получаю сообщение об ошибке: "client_secret" is missing
. Но у меня сложилось впечатление, что поток PKCE не требует секрета клиента... Итак, у меня есть несколько вопросов, на которые я не смог получить однозначный ответ при поиске SO:
Я знаю, что Google позволяет создавать учетные данные для UWP, iOS или Android, и я думаю, что они позволяют передавать код авторизации без секрета клиента, но только потому, что они связаны с конкретным идентификатором приложения/магазина на соответствующих платформах.
Я также уже видел эту ТАК статью , а также эту ТАК статью, но мне не показалось, что она ответила на мой вопрос или предоставила хорошее решение проблемы, с которой я столкнулся.
Является ли единственный способ сохранить секрет клиента в общедоступном исходном коде? Это вообще безопасно? Любая помощь очень ценится!
Заранее спасибо!
Безопасно ли публично раскрывать секрет клиента?
В общем, не лучшая идея. В зависимости от объема секрета
Правильно ли я понимаю, что мне не нужен секрет клиента при использовании потока кода авторизации с PKCE?
Нет, вы не правы. PCKE решает другую проблему безопасности.
Есть ли другой поток/процесс, который мне следует использовать, при котором мне не нужно раскрывать секрет моего клиента, но который все же позволяет мне получить токен обновления?
Вы можете выполнить часть аутентификации на сервере, которым вы управляете.
Является ли единственный способ сохранить секрет клиента в общедоступном исходном коде? Это вообще безопасно? Любая помощь очень ценится!
Вы также можете потребовать, чтобы ваши пользователи зарегистрировали учетную запись разработчика и предоставили свой собственный секрет.
Спасибо! Похоже, что для моего конкретного приложения невозможно получить токен обновления, не раскрывая секрет клиента. Тем более, что области, к которым он предоставляет доступ, считаются конфиденциальными. Это FOSS, поэтому я делаю все возможное, чтобы не требовать каких-либо внешних серверов, управляемых разработчиками.