Как выйти из системы с помощью flutter_appauth?

#flutter #authentication #openid-connect

#flutter #аутентификация #OpenID-подключение

Вопрос:

Мне нужно выйти из flutter_appauth с помощью нажатия кнопки в flutter;

В этом пакете нет никакого метода выхода из системы.

Это мой код токена get:

 appAuth.authorizeAndExchangeCode(AuthorizationTokenRequest(
                clientID, redirectUrl,
                discoveryUrl: discoveryUrl,
                scopes: scopes,
                clientSecret: clientSecret
 

Комментарии:

1. Почему вы используете этот пакет, когда разработчик удалил этот репозиторий из своего github.

2. @MohammadMirshahbazi Я использую flutter_appauth. URL-адрес исправлен в вопросе. pub.dev/packages/flutter_appauth

3. прежде чем вы отредактируете эту ссылку, мы увидим https://pub.dev/packages/flutter_auth/install

4. @MohammadMirshahbaziI знает, и это была моя ошибка. У меня проблема с выходом из системы с пакетом flutter_appauth

5. Ладно, братан, я разберусь, подожди, я решу твою проблему.

Ответ №1:

В этом пакете не было никакого решения для этого, но эта проблема решалась с помощью two way :

  1. Это ваш браузер, поэтому вы можете очистить кэш браузера 🙂
  2. Когда вы вызываете метод для авторизации и обмена кодом, необходимо добавить дополнительный параметр с именем «promptValues» со значением «login». Таким образом, каждый раз, когда выполняется вход в систему, в кэше нет значения, и он всегда запрашивает новый вход в систему.

сделай это :

 final AuthorizationTokenResponse result =
    await appAuth.authorizeAndExchangeCode(
      AuthorizationTokenRequest(
        your_client_id,
        your_localhost,
        promptValues: ['login'],
        discoveryUrl:
        your_discovery_url,
        scopes: [your_scopes],
      ),
    );
 

Комментарии:

1. Мне просто нужна функция для выхода из системы. Он не должен запрашивать информацию для входа в систему при каждом входе в систему!

2. Насколько я понял, для выхода из системы не существует метода, но с помощью solution вы можете очищать кеш каждый раз при входе в систему, поэтому вы выходите из системы, потому что ваш кеш чистый, попробуйте, пожалуйста, это работает.

3. Как я могу очистить кеш? flutter_appauth использует встроенный в webview, и я не могу получить к нему доступ. Я также удаляю каталог getTemporaryDirectory, но ничего не работает.

4. Сохраняете ли вы токен обновления где-нибудь в своем случае, чтобы ваш пользователь мог его подписать?

Ответ №2:

Здесь есть 2 основных варианта, и в качестве первого шага я хотел бы посмотреть, сможете ли вы заставить первый вариант работать в соответствии с комментарием Мохаммеда:

ВАРИАНТ 1: ПРОСТОЙ ВЫХОД ИЗ СИСТЕМЫ

Просто удалите все сохраненные токены из вашего приложения. Проблема заключается в том, что он не удаляет cookie сеанса сервера авторизации. Таким образом, по умолчанию вы не можете принудительно ввести другое приглашение для входа, например, для входа в систему как новый пользователь. Один из способов обойти это — отправить prompt=login в качестве параметра при выполнении перенаправления входа.

ВАРИАНТ 2: ПОЛНЫЙ ВЫХОД ИЗ СИСТЕМЫ

Полный выход из системы включает в себя оба этих действия и может потребовать от вас углубиться во внутренние компоненты AppAuth:

  • Удалите сохраненные токены из вашего приложения
  • Перенаправление для удаления cookie сеанса сервера авторизации с помощью запроса завершения сеанса

Вот несколько примеров моего кода Android для запуска пользовательской вкладки Chrome для перенаправления выхода из системы.

Существуют и другие потенциальные проблемы, такие как прерывистые белые экраны Chrome, которые не возвращаются в приложение после выхода из системы из-за пропущенного жеста пользователя.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

В моих сообщениях в блоге есть некоторые дополнительные сведения об интеграции AppAuth, а также примеры кода, которые вы можете запустить, на случай, если что-то из этого окажется полезным. Я использую библиотеки AppAuth непосредственно из Kotlin / Swift, тогда как вам нужно иметь дело с дополнительным слоем плагина Flutter:

Ответ №3:

Я создал метод, который заботится о выходе пользователя из системы, завершая сеанс таким образом:

 Future<bool> endSession(String idToken) async {
    //work like logout method
    try {
      await appAuth.endSession(EndSessionRequest(
          idTokenHint: idToken,
          issuer: _issuer,
          postLogoutRedirectUrl: _redirectUrl,
          allowInsecureConnections: _allowInsecureConnections));
    } catch (err) {
      print(err);
      return false;
    }
    return true;
  }
 
  • Если вы используете keycloak, тогда _issuer будет что-то вроде этого http://localhost:8080/auth/realms/REALM-NAME
  • idToken это то, что вы получили после входа в систему (внутри AuthorizationTokenResponse )

Ответ №4:

Обновление 2021 года: просто откройте страницу выхода с помощью url_launcher следующим образом:

   if (await canLaunch(logoutUrl)) {
    await launch(logoutUrl);
  }
 
  • Помните: Вы должны перенаправить на пользовательскую схему (которую вы добавили в файл build.gradle) после процесса выхода из системы.

Я решил проблему выхода из системы с помощью хитрости! Я открываю браузер со ссылкой для выхода из системы. Затем перенаправьте на [custom_url]. И вернитесь к приложению с помощью ссылки на приложение.

Вот как я выхожу из системы:

  1. Следуйте этому руководству, чтобы создать хранилище ключей для вашего приложения
  2. Получите отпечатки пальцев сертификата, SHA256 из [сгенерированного ключа].jks с помощью этой команды:

keytool -list -v -хранилище ключей [сгенерированный ключ].jks

  1. Создайте файл assetlinks.json с этим содержимым:
 

    [
      {
        "relation": [
          "delegate_permission/common.handle_all_urls"
        ],
        "target": {
          "namespace": "android_app",
          "package_name": "[app.package.name]",
          "sha256_cert_fingerprints": [
            "The Certificate fingerprints, SHA256 created in step 2."
          ]
        }
      }
    ]

 

и положите его на

https://[custom_url]/.well-known/assetlinks.json

  1. Добавьте фильтр намерений в манифест следующим образом:
 <application ...>
  <activity ...>
    <intent-filter android:autoVerify="true" tools:targetApi="m">
      <action android:name="android.intent.action.VIEW" />

      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />

      <data 
         android:host="[custom_url]"
         android:scheme="https" />
    </intent-filter>
  </activity>
</application> 

  1. И, наконец, это функция выхода из системы:
 

      Future logout() async {
        if (await canLaunch(_logoutUrl))
          await launch(_logoutUrl);
      }