#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 :
- Это ваш браузер, поэтому вы можете очистить кэш браузера 🙂
- Когда вы вызываете метод для авторизации и обмена кодом, необходимо добавить дополнительный параметр с именем «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]. И вернитесь к приложению с помощью ссылки на приложение.
Вот как я выхожу из системы:
- Следуйте этому руководству, чтобы создать хранилище ключей для вашего приложения
- Получите отпечатки пальцев сертификата, SHA256 из [сгенерированного ключа].jks с помощью этой команды:
keytool -list -v -хранилище ключей [сгенерированный ключ].jks
- Создайте файл 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
- Добавьте фильтр намерений в манифест следующим образом:
<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>
- И, наконец, это функция выхода из системы:
Future logout() async {
if (await canLaunch(_logoutUrl))
await launch(_logoutUrl);
}