Как определить UID в Firebase Auth при входе провайдера - PullRequest
0 голосов
/ 02 июля 2019

Мне необходимо определить UID, согласованный с тем, когда пользователь был создан с помощью пользовательского токена на сервере или стороннего поставщика. Если нет способа определить UID изначально, есть ли процесс для:

  1. Создание нового пользователя ДО входа в систему поставщика, чтобы можно было связать учетные данные поставщика
  2. После того, как пользователь создан (с UID от провайдера), создайте нового пользователя с желаемым UID, перенесите учетные данные и затем удалите исходного пользователя.

Они оба кажутся трудными способами решить, что должно быть в целом простой задачей.

EDIT:

Мы создаем внутренний уникальный идентификатор пользователя и сохраняем его в базе данных SQL. Этот идентификатор пользователя используется для идентификации пользователя во всех случаях. Если пользователь создается с помощью стандартного процесса регистрации, он будет создан, а затем сохранен в Firesbase Auth с этим идентификатором пользователя. Если сторонний поставщик создает учетную запись, она сохраняется в Firebase Auth с UID, созданным поставщиком. Этот UID может быть строкой, что означало бы, что если бы мы попытались сохранить его в БД, вся наша кодовая база должна была бы перенести UID типа из int в строку. Вместо этого было бы намного проще, если бы значение UID в Firebase Auth было таким же, как и UID, который мы создаем, что может быть сделано при первом создании пользователя, но НЕ при создании его сторонним поставщиком. Мы не должны поддерживать несколько идентификаторов пользователей, т. Е. Наш идентификатор пользователя НЕ будет совпадать с идентификатором провайдера, поэтому для захвата пользователя и проверки токенов мы хотим использовать наш идентификатор пользователя, а не UID поставщика.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Я написал эту функцию быстрого тестирования для перехода к желаемому UID.Эта функция не идеальна и может использовать больше обработки ошибок, например, если бы у вас была проблема с импортом нового пользователя, пользователь был бы удален и потерян, но в начальном тестировании это то, что я ищу.Было бы идеально, если бы SDK администратора содержал что-то вроде этого, но более надежное на ощупь.

Написано на Go:

    func (AuthImpl) MigrateToUserID(uid string, userID int) (err error) {
    ctx := context.Background()
    var client auth.Client
    client, err = getAuthClient(ctx)
    if err != nil {
        return err
    }

    var userRecord *auth.UserRecord
    if userRecord, err = client.GetUser(ctx, uid); err != nil {
        return err
    }
    userToImport := &auth.UserToImport{}
    userToImport.
        UID(strconv.Itoa(userID)).
        PhoneNumber(userRecord.PhoneNumber).
        CustomClaims(userRecord.CustomClaims).
        Email(userRecord.Email).
        EmailVerified(userRecord.EmailVerified)

    if userRecord.ProviderUserInfo != nil {
        var providers []*auth.UserProvider
        for _, providerUserInfo := range userRecord.ProviderUserInfo {
            providers = append(providers, &auth.UserProvider{
                UID:         providerUserInfo.UID,
                ProviderID:  providerUserInfo.ProviderID,
                Email:       providerUserInfo.Email,
                DisplayName: providerUserInfo.DisplayName,
                PhotoURL:    providerUserInfo.PhotoURL,
            })
        }
        userToImport.ProviderData(providers)
    }

    if err = client.DeleteUser(ctx, uid); err != nil {
        return err
    }

    if _, err = client.ImportUsers(ctx, []*auth.UserToImport{userToImport}); err != nil {
        return err
    }
    return nil
}
0 голосов
/ 02 июля 2019

Поставщик удостоверений должен определить UID учетной записи и гарантировать, что UID является глобально уникальным.Firebase не предоставляет инструмент для генерации UID, так как большинство провайдеров идентификации уже имеют такую ​​систему.

...