Система входа на основе QR-кода [React-native + firebase] - PullRequest
0 голосов
/ 13 декабря 2018

Я новичок здесь.Я работаю над личным проектом (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.log("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":{},
    ......
  }

}

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

1 Ответ

0 голосов
/ 13 декабря 2018

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

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