Firebase auth email - предотвращать фальшивые / недействительные аккаунты - PullRequest
0 голосов
/ 26 марта 2020

Я использую учетные записи электронной почты Firebase для регистрации пользователей на сайте. В последнее время я заметил следующие случаи:

  1. Пользователи регистрируются с использованием действующего адреса электронной почты, а затем никогда не проверяют адрес электронной почты
  2. Пользователи пытаются зарегистрироваться с использованием поддельного адреса электронной почты

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

admin.auth().getUser(uid).then(user => {
  const creationTime = user.metadata.creationTime
  const isVerified = user.emailVerified
  const lastSignInTime = user.lastSignInTime
  if(!isVerified){
    // Process and delete unverified accounts after x days
    ...
  }
})

Как мы можем обрабатывать учетные записи, где адрес электронной почты является поддельным или с ошибкой? Я не вижу какого-либо свойства объекта firebase.User , указывающего на недопустимый адрес электронной почты. Однако мы получаем сообщение об ошибке доставки почты для каждого пользователя, который зарегистрировался с использованием недопустимого адреса электронной почты - этого недостаточно для автоматической очистки поддельных / недействительных учетных записей.

Каковы оптимальные методы предотвращения ложных регистраций?

С уважением / K

Ответы [ 2 ]

1 голос
/ 26 марта 2020

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

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

0 голосов
/ 29 марта 2020

Итак, это код, который я придумал для очистки непроверенных учетных записей Возможно, не самое элегантное решение, но работает.

exports.scheduledUserCleanup = functions
.region('europe-west1')
.pubsub
.schedule('0 3 * * *')
.timeZone('Europe/Stockholm')
.onRun(async (event) => {
  const today = moment()
  const inactivityThresholdDays = 7 //Get purge threshold days

  let myPromises = [] //Collect all promises to carry out 

  //Search for users that have NOT validated email
  database.ref('user-signups').once('value', (usersSnapshots) => {
    usersSnapshots.forEach((snapshot) => {
      const uid = snapshot.key

      // Get user from firebase auth
      admin.auth().getUser(uid)
      .then((firebaseAuthUser) => {
        const creationTimeStr = firebaseAuthUser.metadata.creationTime
        const isVerified = firebaseAuthUser.emailVerified
        const lastSignInTimeStr = firebaseAuthUser.metadata.lastSignInTime
        const neverSignedIn = (creationTimeStr === lastSignInTimeStr) ? true : false

        if(!isVerified && neverSignedIn){
          // Process and delete unverified accounts after 7 days
          const creationTime = moment(creationTimeStr)
          const daysSinceCreation = today.diff(creationTime, 'days')

          if(daysSinceCreation > inactivityThresholdDays){
            console.log('Remove user from db and Firebase auth', uid)
            myPromises.push( admin.auth().deleteUser(firebaseAuthUser.uid) )
            myPromises.push( database.ref(`user-signups/${uid}`).remove() )
          }else{
            console.log(`Keep for ${inactivityThresholdDays} days before deleting`, uid)
          }
        }
        return true
      })
      .catch((error) => {
        // Remove if not found in Firebase Auth
        const notFoundInFirebaseAuth = (error.code) ? error.code === 'auth/user-not-found' : false
        if(notFoundInFirebaseAuth){
          console.log('Remove user from db', uid)
          myPromises.push( database.ref(`user-signups/${uid}`).remove() )
        }
        return false
      })
    })
  })

  // Execute promises
  return Promise.all(myPromises)
  .then(() => Promise.resolve(true))
  .catch((err) => {
    console.error('Error', err)
    return Promise.reject(err)
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...