В настоящее время я работаю над приложением React Native, где использую Google OAuth для аутентификации пользователей. Я использую метод openAuthSessionAsync из API Expo AuthSession для обработки потока аутентификации. Процесс входа в систему работает нормально, и я могу успешно получить идентификатор сеанса. Однако я застрял в том, как закрыть окно браузера после завершения входа в систему.
Вот соответствующая часть моего кода:
const signIn = async () => {
const frontEndUrl = getBaseUrl();
const result = await Browser.openAuthSessionAsync(
`${frontEndUrl}/auth/google?mobile=true`,
`${frontEndUrl}`
;
console.info(result.type);
if (result.type !== "success") return;
const url = Linking.parse(result.url);
const sessionID = url.queryParams?.session_id?.toString() ?? null;
if (!sessionID) return;
await SecureStore.setItemAsync("session_id", sessionID);
};
Я следовал руководству из Lucia Auth Guidebook на GitHub OAuth с Expo, но в нем не упоминается, как закрыть браузер после аутентификации или решить проблемы, не получив никакого результата.
Проблемы, с которыми я столкнулся:
Окно браузера не закрывается: после успешного входа в систему окно браузера остается открытым.
Результат не возвращен: объект результата openAuthSessionAsync не содержит никаких данных, что делает невозможным продолжение потока аутентификации.
Я просмотрел документацию Expo и React Native, но пока не нашел решения.
Есть ли способ программно закрыть окно браузера после успешного входа в систему с помощью openAuthSessionAsync?
Или просто убедиться, что метод openAuthSessionAsync возвращает ожидаемый результат, чтобы я мог продолжить процесс аутентификации?
Любая помощь или руководство будут очень признательны!
Заранее спасибо!
Дополнительный контекст:
Реагировать нативную версию: 0.74.2 Версия Expo SDK: 51 Платформа: Андроид Репозиторий Github: RecordScratch





Вы можете использовать WebBrowser.dismissAuthSession(), чтобы программно закрыть веб-браузер.
Больше документации здесь.
Что касается отсутствия результата: у меня была та же проблема, и я переключился на WebBrowser.openBrowserAsync, и это решило проблему для меня.
Вам необходимо настроить диплинкинг, чтобы вернуться в приложение из браузера Expo.
Я смог решить проблему.
Мне просто нужно было предоставить глубокую ссылку из браузера Expo на мобильное приложение. Результат вернет успех, как только я настрою URL-адрес перенаправления на глубокую ссылку, предоставленную браузером Expo.
Так
const result = await Browser.openAuthSessionAsync(
`${frontEndUrl}/auth/google?mobile=true`,
`${frontEndUrl}`);
Просто стал
const result = await Browser.openAuthSessionAsync(
`${frontEndUrl}/auth/google?mobile=true`,
`exp://192.168.2.100:8081`);
А затем в моем внутреннем обработчике аутентификации мне пришлось перенаправить на exp://192.168.2.100:8081 после завершения.
Привет, спасибо за предложение. Мне было интересно, как я могу проверить URL-адрес браузера, чтобы я мог вызвать WebBrowser.dismissAuthSession(). Я попробовал Linking.addEventListener, однако он обнаруживает только изменения мобильного URL-адреса, а не изменения URL-адреса браузера.