Вопрос или проблема
Резюме проблемы
Я сталкиваюсь с проблемой с пакетом google_sign_in
для Flutter при запросе дополнительных прав для доступа к Google Calendar, конкретно на iOS. Стандартный процесс входа в Google работает без проблем. Однако вызов requestScopes
для получения доступа к календарю всегда возвращает false
на iOS
, несмотря на то, что разрешения предоставлены. На Android
requestScopes
работает как и ожидалось, возвращая true
после предоставления пользователем доступа.
Среда
- Платформа: iOS
- Версия Flutter: 3.24.3
- Версия пакета google_sign_in: 6.2.1
- Используемое устройство: Несколько устройств и симуляторов iOS (IOS 18)
Шаги для воспроизведения
- Настройка Firebase Authentication и Google Calendar API:
- Firebase Authentication и Google Sign-In настроены в Консоли Firebase.
- Google Calendar API включен в Консоли Google Cloud.
- Создание учетных данных OAuth:
- Учетные данные OAuth 2.0 были сгенерированы для Android и iOS в Консоли Google Cloud.
- Для iOS значение REVERSED_CLIENT_ID правильно настроено в Info.plist приложения.
- Вход и запрос прав:
- После входа через Google вызов
requestScopes
для доступа к календарю запрашивает разрешение. Даже после предоставления разрешения метод по-прежнему возвращаетfalse
.
static const _scopes = [
CalendarApi.calendarReadonlyScope,
CalendarApi.calendarEventsReadonlyScope,
];
final isAuthorized = await _googleSignIn.requestScopes(_scopes);
print(isAuthorized); // Возвращает false, даже после предоставления разрешения
- Ожидаемое поведение:
requestScopes
должен возвращатьtrue
после успешного предоставления разрешений, как это происходит наAndroid
.
- Наблюдаемое поведение:
requestScopes
всегда возвращаетfalse
наiOS
, несмотря на получение письма от Google, указывающего, что доступ был предоставлен.
Что я пробовал
- Проверка конфигурации Консоли Google Cloud:
- Проверил, что учетные данные OAuth были правильно настроены для iOS и связаны с Firebase.
- Подтвердил, что Google Calendar API и Google Sign-In включены.
- Убедился, что тип пользователя установлен на Внешний и статус в Производстве.
- Прямой запрос прав через токен доступа:
- Попытался обойти
requestScopes
путем полученияaccessToken
непосредственно после входа и вручную получить доступ к Google Calendar API. Этот способ работает, но обходит функциональностьrequestScopes
в Flutter.
final GoogleSignInAccount? account = await _googleSignIn.signIn();
final GoogleSignInAuthentication auth = await account!.authentication;
final accessToken = auth.accessToken;
// Ручной вызов API с использованием accessToken
final response = await http.get(
Uri.parse('https://www.googleapis.com/calendar/v3/users/me/calendarList'),
headers: {
'Authorization': 'Bearer $accessToken',
},
);
if (response.statusCode == 200) {
// Успех
}
Запрос помощи
Эта проблема, похоже, специфична для iOS
с google_sign_in
. любая помощь по вопросам:
- Почему
requestScopes
всегда возвращаетfalse
наiOS
, несмотря на предоставленные разрешения. - Возможные обходные пути или сведения о причине этого поведения.
Ответ или решение
Проблема с запросом scopes в пакете google_sign_in для iOS
Обзор проблемы
Вы столкнулись с тем, что метод requestScopes
в пакете google_sign_in
для Flutter не возвращает ожидаемый результат на iOS, даже если разрешения на доступ к API Google Календарь были предоставлены. Согласно описанию, стандартный процесс входа с Google работает, однако запрашиваемый доступ к календарю завершается неудачно, в то время как на Android этот метод функционирует корректно.
Описание среды
- Платформа: iOS
- Версия Flutter: 3.24.3
- Версия пакета google_sign_in: 6.2.1
- Устройства для тестирования: Несколько iOS-устройств и эмуляторов (iOS 18)
Шаги для воспроизведения проблемы
-
Настройка аутентификации Firebase и Google Календарь API:
- Функционал аутентификации Firebase и Google Sign-In настроен корректно.
- Google Календарь API активирован в Google Cloud Console.
-
Создание учетных данных OAuth:
- Учетные данные OAuth 2.0 были сгенерированы для iOS и Android.
- Реверсированный клиентский идентификатор (REVERSED_CLIENT_ID) установлен в Info.plist вашего приложения.
-
Вход и запрос Permissions:
- После входа в систему вы вызываете
requestScopes
для доступа к календарю, который возвращаетfalse
, несмотря на подтверждение разрешения.
- После входа в систему вы вызываете
static const _scopes = [
CalendarApi.calendarReadonlyScope,
CalendarApi.calendarEventsReadonlyScope,
];
final isAuthorized = await _googleSignIn.requestScopes(_scopes);
print(isAuthorized); // Возвращает false, несмотря на предоставленные разрешения
-
Ожидаемое поведение:
- Метод
requestScopes
должен возвращатьtrue
, если разрешения были успешно предоставлены, что и наблюдается на Android.
- Метод
-
Наблюдаемое поведение:
requestScopes
всегда возвращаетfalse
на iOS, даже после получения уведомления от Google о том, что доступ был предоставлен.
Проверенные шаги
-
Проверка конфигурации в Google Cloud Console:
- Убедитесь, что учетные данные OAuth корректно настроены для iOS и связаны с Firebase.
- Проверьте, что и Google Sign-In, и Google Календарь API активированы.
- Убедитесь, что тип пользователя установлен на "Внешний" с статусом "В производстве".
-
Прямой запрос scopes через accessToken:
- Вы пытались получить
accessToken
после входа и вручную получить доступ к API Google Календаря. Этот подход работает, но обходит функционалrequestScopes
.
- Вы пытались получить
final GoogleSignInAccount? account = await _googleSignIn.signIn();
final GoogleSignInAuthentication auth = await account!.authentication;
final accessToken = auth.accessToken;
// Ручной вызов API с использованием accessToken
final response = await http.get(
Uri.parse('https://www.googleapis.com/calendar/v3/users/me/calendarList'),
headers: {
'Authorization': 'Bearer $accessToken',
},
);
if (response.statusCode == 200) {
// Успех
}
Запрос помощи
Ваша проблема выглядит специфичной для iOS и пакета google_sign_in
. Вам стоит учесть следующие моменты:
-
Почему
requestScopes
всегда возвращаетfalse
на iOS, несмотря на предоставленные разрешения? Это может быть связано с различиями в обработке состояний разрешений на iOS по сравнению с Android. Возможно, необходимо убедиться, что ваша конфигурация OAuth полностью соответствует требованиям Google. -
Возможные обходные пути или понимание причин данного поведения могут включать следующие шаги:
- Проверьте наличие обновлений для пакета
google_sign_in
или Flutter, так как проблема могла быть исправлена в более новых версиях. - Также рекомендуется посмотреть на issue tracker для пакета
google_sign_in
, чтобы узнать, были ли аналогичные вопросы и решения от других разработчиков. - Попробуйте использовать другие библиотеки для работы с Google API, которые могут предоставлять более полное управление процессом авторизации и разрешений.
- Проверьте наличие обновлений для пакета
Заключение
Убедитесь, что все ваши настройки в Google Cloud Console и Firebase корректны и соответствуют требованиям. Рекомендуем обратиться на форумы разработчиков или в службу поддержки Google, если проблема не будет решена самостоятельно. Успеха вам в устранении данной проблемы.