Запрос Flutter OAuth не выполняется при использовании самозаверяющего сертификата - PullRequest
2 голосов
/ 18 июня 2020

У меня есть сервер, поддерживающий oauth2.0 с предоставлением кода авторизации. сервер использует самозаверяющий сертификат, который я вручную установил на свое устройство android. Я использую стандартную библиотеку oauth2 https://pub.dev/packages/oauth2 для выполнения потока oauth. Теперь все работает нормально до этого шага

var client = await grant.handleAuthorizationResponse(responseUrl.queryParameters);

, где клиент должен сделать почтовый запрос, используя код, полученный во время авторизации, чтобы получить токен доступа. (см. пример из https://pub.dev/packages/oauth2#authorization -code-grant ) здесь я получаю

HandshakeException: Handshake error in client (OS Error: 
E/flutter (11483):  CERTIFICATE_VERIFY_FAILED: self signed certificate in certificate

Теперь я уже знаю, как разрешить мой сертификат или полностью обойти проверку сертификата с помощью объекта HttpClient. проблема в том, что HttpClient является частью библиотеки dart._http, которая находится в http.dart, но объект Client, который использует oauth2.dart, находится из библиотеки http в client.dart. хотя оба они кажутся http-клиентами и поддерживают методы публикации, только первый из них поддерживает настраиваемый SecurityContext. и, по-видимому, я не могу бросить одно в другое. У меня вопрос, состоящий из двух частей:

  1. был ли у кого-нибудь подобный опыт работы с этой библиотекой OAuth2.0 или знаю, могу ли я вообще заставить ее работать с моим самозаверяющим сертификатом?
  2. Моя последняя идея - создать собственный клиентский класс, расширяющий http.BaseClient. Поскольку я заметил, что OAuth2.0 использует только метод отправки из клиентского объекта, я думаю переопределить этот метод и использовать объект HttpClient для выполнения почтового запроса. однако метод post из HttpClient принимает только Uri, тогда как метод из BaseClient принимает URL-адрес, заголовки, тело и кодировку. любая идея, как я могу установить их в запросе HttpClient?

Я также изучал oauth2_client, но он даже не поддерживает настраиваемый http-клиент и oauth_dio, но он реализует только предоставление учетных данных клиента, тогда как мой сервер поддерживает только предоставление кода авторизации.

1 Ответ

1 голос
/ 18 июня 2020

DART ВАРИАНТ 1

Похоже, у Dart есть собственные root сертификаты. Предпочтительный вариант - избегать написания кода безопасности. Вместо этого в среде разработки настройте сертификат root вашего самоподписанного хоста как доверенный Dart в соответствии с этого руководства .

DART ВАРИАНТ 2

Похоже, что Dart также поддерживает модель обратного вызова сертификата C#, где есть обратный вызов неверного сертификата , который можно переопределить. Не уверен, что для этого вам нужно создать подкласс HttpClient.

/* PSEUDOCODE */
bool callback(X509Certificate cert, String host, int port) {

  // Don't allow any exceptions in production
  if (currentEnvironment == "DEV" && host == "myhost.com") {
    return true;
  }

  // Use system
  return base.callback(cert, host, port)

}

МОБИЛЬНЫЕ РЕКОМЕНДАЦИИ OAUTH

Я вижу, вы пробуете несколько разных библиотек для решения проблемы доверия SSL проблема. Поэтому я решил указать, что я ищу в мобильной библиотеке OAuth, в соответствии с стандартами мобильной безопасности , где следующие ключевые рекомендации:

  • Использовать код авторизации Поток (PKCE)
  • Вход через системный браузер
  • Предпочитать URL-адреса перенаправления HTTPS (заявленные схемы HTTPS)

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

Предпочтительной библиотекой с точки зрения безопасности, вероятно, является Flutter AppAuth . Я часто использовал библиотеки AppAuth с самоподписанными сертификатами, но библиотека AppAuth сталкивается со следующими проблемами:

  • Вход в системный браузер сложно сделать надежным
  • Может быть довольно много больше работы, чем ваши заинтересованные стороны хотят заплатить
  • Аспекты взаимодействия с пользователем могут отличаться от того, к чему люди привыкли
  • Мост Flutter может иметь свои проблемы

ПРИЛОЖЕНИЕ ПОДТВЕРЖДАЕТ РЕСУРСЫ МОИХ

Когда у вас будет время, возможно, стоит просмотреть мои сообщения в блоге и запустить мои образцы кода Swift / Kotlin, чтобы узнать, думаете ли вы об этом поведение было бы вам полезно:

...