Система входа на основе QR-кода [React-native + firebase]

Я здесь новичок. Я работаю над личным проектом (React Native + firebase), где поток входа пользователя выглядит примерно так:

  1. У каждого пользователя приложения уже есть идентификационная карта с уникальным идентификатором пользователя, предоставленным им в виде QR-кода.

  2. Пользователь сканирует QR-код на странице входа в приложение.

  3. Если уникальный идентификатор совпадает с идентификатором пользователя, уже присутствующим в базе данных, пользователь имеет право доступа к приложению.

Обратите внимание, что в моем приложении нет регистрации.

Мне сложно понять, как будет выглядеть процесс реализации в firebase. Как авторизовать пользователя в firebase? Можно ли для этого использовать firebase-auth?

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

    _login = (status)=> {
    if (status === "success") {
      this.setState ({
        logInStatus: "Login successful!"
      })
      this.props.navigation.navigate("Question")
    }
   else {
     this.setState ({
       logInStatus: "Login failed!"
     })
     this.props.navigation.navigate("Login")
   }
  }

    //check if user exists in the database
      userExists = async (data) => {
        this.setState ({
          logInStatus: "Logging you in!"
        })
        //connect to firebase
        let userRef = firebase.database().ref('/users/')
        let status

        try {
          let value = await userRef.child(data).once('value', function(snapshot) {
            if (snapshot.exists()) {
              status = "success"
            }

          })
        }
        catch(error) {
          this.setState ({
            logInStatus: "Login failed. Try again!"
          })
          console.info("Reached error")
        }

        this._login(status)
      }

    //when user has scanned once
      _handleBarCodeRead = async ({data})=> {
        this.userExists(data)
    //stop user from scanning again
        this.setState ({
          barCodeRead: true,
          fullScreen: false,
        })

      }

Ясно, что это небезопасный способ входа в систему ... что может быть лучше?

Это структура базы данных, которую я использую сейчас:

{
  "schools": {
    "school_001":{
      "name": <name>,
      "id": <school_id>,
      .....other properties unique to the school
    },
    "school_002": {},
    "school_003": {},
    .....
    "school_N": {}
  },

  "groups":{
    "group_001":{
      "group_id": <group ID>,
      "school_id": <school ID>,
      "members":[array list of group memebers/users]
      ....other group properties unique to the group
    },
    "group_002":{},
    .....
    "group_N":{}
  },

  "users":{
    "user_001":{
      "user_id":<user ID>,
      "group_id":<group ID>,
      "school_id": <school ID>
      ....other user properties unique to the user
    },
    "user_002":{},
    ....
    "user_N":{}
  },

  "activity_feed":{
    "school_001":{
      "group_001":{
        "activity_001":{
          "actor": <name of the user>,
          "action": <user's action>,
          ....other properties related to the activity

        },
        "activity_002":{},
        ......
      },
      "group_002":{},
      ....
    },
    "school_002":{},
    ......
  }

}

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

Добро пожаловать в SO. Вопрос немного неясный; вы спрашиваете, как создать правило безопасности? Если это так, правила напрямую связаны с тем, к чему вы хотите, чтобы пользователи имели доступ, поэтому нам нужно знать это, чтобы ответить. Если еще чего-то спрашиваешь, непонятно. Можете ли вы обновить свой вопрос, чтобы мы знали, о чем вы на самом деле спрашиваете? Чтобы задавать вопросы, ознакомьтесь с двумя следующими руководствами: Как мне задать хороший вопрос? и Как создать минимальный, полный и проверяемый пример.

Jay 15.12.2018 15:26

Привет, Джей, я обновил свой вопрос. Надеюсь, теперь стало более ясно ...

Rajeev Jha 15.12.2018 18:11

Намного лучше. Как вы создаете пользователей в Firebase - через консоль Firebase или каким-либо другим способом? Как QR-код попадает в firebase? У вас есть структура Firebase, в которой хранятся QR-коды? Дайте нам больше информации, и, возможно, мы сможем помочь.

Jay 15.12.2018 18:18

У меня есть список пользователей с их идентификаторами в электронной таблице. Сценарий приложения помещает данные в созданную мной структуру базы данных firebase. Я думаю, это похоже на создание пользователей в Firebase вручную?

Rajeev Jha 15.12.2018 18:32

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

Jay 15.12.2018 21:04

@Jay Только что добавил структуру firebase, которую я использую прямо сейчас. Надеюсь, это поможет ответить на мой вопрос.

Rajeev Jha 16.12.2018 08:11

Если у вас есть сценарий, который отправляет данные в firebase (на узел пользователей), это совершенно не связано с созданием пользователей вручную. Эти данные - просто данные и не имеют ничего общего с пользователем в Firebase. То, как вы это делаете, очень небезопасно и идет в обход безопасной аутентификации Firebase, поэтому не рекомендуется. Тем не мение. Если ваша реализация должна быть такой, как насчет создания пользователей в консоли Firebase и использования этого uid в качестве QR-кода? Опять же, не рекомендуется, но тогда у вас может быть общий пароль для всех пользователей, но у каждого пользователя будет хотя бы свой собственный UID, и вы можете использовать правила Firebase.

Jay 16.12.2018 15:03
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
7
1 183
1

Ответы 1

Вы должны указать это в своем правиле безопасности firebase

{
  "rules": {
    ".read": "auth !== null",
    ".write": "auth !== null"
  }
}

Но как мне авторизовать пользователя? В моем приложении нет регистрации. Пользователи просто входят в систему с помощью предоставленного им уникального идентификатора.

Rajeev Jha 14.12.2018 21:48

Не уверен, что этот ответ действительно применим к вопросу. OP спрашивает, как аутентифицировать пользователей с помощью QR-кода, и все это гарантирует, что пользователь аутентифицирован для чтения и записи.

Jay 15.12.2018 18:22

Другие вопросы по теме