#flutter #firebase-authentication #azure-active-directory
#flutter #firebase-аутентификация #azure-active-directory
Вопрос:
Для мобильного приложения Flutter я пытаюсь использовать Microsoft OAuthProvider, чтобы получить учетные данные Firebase, с помощью которых пользователь может войти в Firebase с помощью своей учетной записи Azure AD.
Самым близким, что я получил, было использование стороннего пакета авторизации Active Directory для входа пользователя и получения токена доступа. Однако при сбое входа в Firebase появляется сообщение об ошибке, в котором указывается, что idToken неверен.
final AadOAuth oauth = new AadOAuth(config);
await oauth.login();
// accessToken looks legit
String accessToken = await oauth.getAccessToken();
String idToken = await oauth.getIdToken();
OAuthProvider provider = OAuthProvider('microsoft.com');
// Also tried the constructor without the idToken
OAuthCredential credential = provider.credential(accessToken: accessToken, idToken: idToken);
// app fails here:
await FirebaseAuth.instance.signInWithCredential(credential);
// this works fine, but only on web platform:
await FirebaseAuth.instance.signInWithPopup(provider);
Поскольку это ошибка, зависящая от платформы (в данном случае iOS), сведения об исключении не отображаются. Все, что я получаю, это:
Исключение PlatformException(внутренняя ошибка,) nativeErrorCode: 17999
Вот настройки моего приложения на портале Azure:
Полный манифест здесь
Кто-нибудь успешно использовал Microsoft Auth для входа пользователя в Firebase в мобильном приложении Flutter?
Комментарии:
1. Я не уверен, что это причина вашей проблемы. Пожалуйста, проверьте, включен ли ваш
config
includesopenid
, который вернет токен id.2. Можете ли вы включить сообщение об ошибке и как вы определяете
config
?3. Спасибо, Аллен, добавление OpenID в область действия вернуло действительный токен id, но приложение по-прежнему завершается сбоем в той же строке с кодом ошибки 17999. Обновляю мой вопрос.
4. вы получили решение? Я также сталкиваюсь с той же проблемой.
5. @RMRAHUL вы пробовали ответ Паураха? У меня это сработало.
Ответ №1:
Для этого можно использовать пакет Firebase Auth OAuth.
И войдите в firebase с помощью поставщика авторизации Microsoft.
User user = await FirebaseAuthOAuth().openSignInFlow(
"microsoft.com", ["email openid"], {'tenant': 'your-tenent-id'});
Это хорошо интегрируется с firebase, поэтому firebase authStateChange
также работает с этим методом.
Комментарии:
1. Есть ли способ использовать данные с помощью этой библиотеки для получения токена Microsoft Access, чтобы я мог получить доступ к MS Graph?
2. Где я могу получить идентификатор клиента?
3. Используя это, я получаю сообщение об ошибке здесь — github.com/amrfarid140/firebase_auth_oauth/issues/49 . Кто-нибудь может помочь?
4. @MateusFelipe вы получаете свой идентификатор клиента, перейдя в свойства клиента в вашем azure
5. При использовании этой опции я получаю сообщение об ошибке
TypeError: Cannot read properties of undefined (reading 'auth')
, которое кто-нибудь знает, почему?
Ответ №2:
Вам нужно просто не получать idToken, просто убедитесь, что вы добавили id_token для response_type, а также OpenID scope, например
provider.addScope('openid');
Также проверьте, разрешен ли неявный поток с помощью токена id в настройках приложения портала Azure (вы должны проверить токены ID на вкладке Аутентификация в разделе Неявное предоставление).
Комментарии:
1. Я создаю мобильное приложение. Неявный поток предоставления доступен только для веб-приложения. Я попытался создать веб-клиент и отметить эти два поля и включить область OpenID, но поток по-прежнему завершается ошибкой в той же строке с той же ошибкой.
2. вы пробовали
provider.credential
использовать только idToken?3. и вы используете Azure B2C directory или обычный Azure?
4. Я не использую B2C, и создание учетных данных только с помощью токена id завершается с ошибкой на том же шаге, но с немного другим сообщением об ошибке:
error code: internal-error
Ответ №3:
Хорошо, чем вы добавили Microsoft в качестве поставщика аутентификации на странице метода входа в конфигурацию аутентификации firebase? А также пытались ли вы пройти аутентификацию с помощью Auth после метода getCredentials, как указано в документации?
provider.getCredentialWith(nil) { credential, error in
if error != nil {
// Handle error.
}
if credential != nil {
Auth().signIn(with: credential) { authResult, error in
if error != nil {
// Handle error.
}
// User is signed in.
// IdP data available in authResult.additionalUserInfo.profile.
// OAuth access token can also be retrieved:
// authResult.credential.accessToken
// OAuth ID token can also be retrieved:
// authResult.credential.idToken
}
}
}
Ответ №4:
пакет аутентификации firebase содержит метод signInWithPopup, поэтому вам больше не нужен firebase_auth_oauth. вот мой код:
Future<UserCredential?> loginWithMicrosoft() async {
OAuthProvider provider = OAuthProvider('microsoft.com');
provider.setCustomParameters({
"tenant": "your-tenant-id",
});
provider.addScope('user.read');
provider.addScope('profile');
try {
final userCredential = await FirebaseAuth.instance.signInWithPopup(provider);
return userCredential;
} on FirebaseAuthException catch(err) {
debugPrint(err.message);
// Handle FirebaseAuthExceptions
// ex: firebase_auth/account-exists-with-different-credential
}
}
Не забудьте добавить URI перенаправления и включить де-области в Azure Portal.
Комментарии:
1. Не поддерживается для мобильных приложений