Как зарегистрировать пользователя Azure AD в Firebase в мобильном приложении Flutter?

#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 includes openid , который вернет токен 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. Не поддерживается для мобильных приложений