Пользовательская аутентификация Firebase с помощью Microsoft Azure / Graph

Я создаю корпоративное приложение с помощью Microsoft Graph для входа. После успешной подписи я хочу использовать токен, который будет отправлен для аутентификации в Firebase Auth (чтобы я мог обеспечить доступ к базе данных).

токен, полученный после успешного входа в систему, нельзя использовать непосредственно в Firebase.

на Firebase пользовательские инструкции Auth страница он говорит:

получите ключи сервера вашего проекта:

  1. перейдите на страницу учетные записи служб в настройках проекта.
  2. нажмите Создать новый Закрытый ключ в нижней части раздела Firebase admin SDK страницы учетные записи служб.
  3. пара открытого и закрытого ключей новой учетной записи службы автоматически сохраняется на вашем компьютере. Скопируйте этот файл на сервер аутентификации.

третий пункт говорит, что нужно ввести ключ к серверу проверки подлинности. Заключаться в следующем можно с помощью Microsoft Graph или Azure AD?

ключ, который Firebase дает вам является . Я проверил портал регистрации приложений Microsoft что позволяет редактировать Манифест приложений, но без везения.

на

4 ответов


теперь я полностью разобрался в этом. Благодаря обширным исследованиям и большой помощи здесь, на Stackoverflow, мне удалось решить эту проблему.

обновление

Секреты базы данных в настоящее время устарели и используют устаревший генератор токенов Firebase. Теперь Firebase Admin импорт достаточно хороша.

Итак, вот мои выводы:

1. Вы DO нужно отправить ваши закрытые ключи к вашим функциям firebase при чеканке токена Firebase. В в консоли Firebase вы можете извлечь ключ и переименовать файл в service-account.json. Это должно быть помещено в ваш функции перед Firebase deploy

  1. в своем index.js файл, вы можете получить файл службы, введя этот код:

    const admin = require('firebase-admin');
    
  2. напишите функцию для приема информации от другой службы аутентификации:

    // Create a Firebase token from any UID
    exports.createFirebaseToken = functions.https.onRequest((req, res) => {
    
      // The UID and other things we'll assign to the user.
      const uid = req.body.uid;
      const additionalClaims = {
        name: req.body.name,
        email: req.body.email
      };
    
      // Create or update the user account.
      const userCreationTask = admin.auth().updateUser(uid, additionalClaims).catch(error => {
    
        if (req.method === 'PUT') {
          res.status(403).send('Forbidden!');
        }
    
        if (req.method === 'GET') {
         res.status(403).send('Please use POST for this function');
        }
    
        // If user does not exists we create it.
        if (error.code === 'auth/user-not-found') {
          console.log(`Created user with UID:${uid}, Name: ${additionalClaims.name} and e-mail: ${additionalClaims.email}`);
          return admin.auth().createUser({
          uid: uid,
          displayName: additionalClaims.name,
          email: additionalClaims.email,
        });
            }
            throw error;
            console.log('Error!');
        });
    
    
        return Promise.all([userCreationTask]).then(() => {
          console.log('Function create token triggered');
          // Create a Firebase custom auth token.
          admin.auth().createCustomToken(uid, additionalClaims).then((token) => {
          console.log('Created Custom token for UID "', uid, '" Token:', token);
            res.status(200).send(token);
            return token
        });
      });
    });
    

это очень важно ответить с res.status так как это завершит задачу. Один return заявление этого не сделает. Полностью рабочий образец из Firebase себя можно найти на github

  1. теперь вы можете сделать HTTP-запроса это может выглядеть примерно так, используя Alamofire и swift

    Alamofire.request("https://us-central1-<YOUR DATABASE REFERENCE>.cloudfunctions.net/createFirebaseToken", 
    method: .post, parameters: parameters, encoding: JSONEncoding.default).
    responseString(completionHandler: { (token) in
        // Handle the result here
    })
    

    в этом случае Parameters обычный , который содержит все, что вы хотите добавить в пользователи аккаунт военнослужащих.

  2. важно любой с вашим URL cloudfunctions может вызвать этот токен чеканки. Поэтому убедитесь, что вы добавили меры безопасности, чтобы справиться с этим. это кратко упоминается в видеоролике Firecast на youtube, сделанном Firebase и также обсуждался в этот поток в Stackoverflow

  3. когда ваш клиент получил токен, вы настраиваете знак auth в iOS или Android как описано в документации.

  4. теперь вы аутентифицированы как к Firebase и Microsoft

  5. я также добавил дополнительный уровень безопасности, проверив, что ID я получил от Microsoft, то же самое ID хранится в аутентифицированной учетной записи из Firebase.


проблема в том, что вам нужно иметь какой-то фрагмент кода свой который реагирует на успех аутентификации AAD IDP, а затем генерирует JWT для использования Firebase. Это JWT генерируется С помощью закрытый ключ, поставляемый firebase. Вы указали, что по крайней мере часть вашего кода находится на Java, что является хорошей новостью, так как это один из языков Firebase Admin SDK поддерживает. Теоретически, я полагаю, вы могли бы сделать это символическое поколение в своем код мобильного приложения, но я настоятельно рекомендую этого не делать, так как это потребует развертывания вашего закрытого ключа с вашим приложением, что скомпрометирует его. Вам нужно будет создать веб-службу, которая может обрабатывать эти запросы аутентификации из вашего приложения, и ответить JWT, сгенерированным Firebase admin SDK. Как только ваше мобильное приложение имеет этот JWT, созданный вашим сервисом, он может использовать его для подключения к Firebase в качестве этого пользователя.


это намного проще, чем вы думаете. После проверки подлинности в Microsoft и получения учетных данных Microsoft, вам просто нужно получить связанный идентификатор пользователя Microsoft для этих учетных данных. Затем вы можете монтировать пользовательский токен Firebase и установить Firebase uid к тому же Microsoft ID пользователя. Например, вы можете сделать это следующим образом с узлом администратора Firebase.JS SDK:

admin.createCustomToken(msftUid, additionalUserClaims)
  .then(customToken => {
    // Return this to the client.
  })

после того, как вы отправите его обратно клиенту, вы затем позвоните signInWithCustomToken(customToken) который будет входить в тот же пользователь с помощью Firebase Auth. У этого пользователя будет currentUser.uid равно идентификатору пользователя Microsoft.


Я создал пример здесь для Федеративной аутентификации Firebase web и браузера. Ответ проверки подлинности от Azure AD проверяется функцией, настраиваемый маркер firebase отчеканен и отправляется интерфейсу; который отправляется службе проверки подлинности Firebase.