Я здесь новичок. Я работаю над личным проектом (React Native + firebase), где поток входа пользователя выглядит примерно так:
У каждого пользователя приложения уже есть идентификационная карта с уникальным идентификатором пользователя, предоставленным им в виде QR-кода.
Пользователь сканирует QR-код на странице входа в приложение.
Если уникальный идентификатор совпадает с идентификатором пользователя, уже присутствующим в базе данных, пользователь имеет право доступа к приложению.
Обратите внимание, что в моем приложении нет регистрации.
Мне сложно понять, как будет выглядеть процесс реализации в 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":{},
......
}
}
Я хочу, чтобы у пользователей был доступ на запись только к своим собственным свойствам пользователя, свойствам определенных групп и каналу активности группы.
Привет, Джей, я обновил свой вопрос. Надеюсь, теперь стало более ясно ...
Намного лучше. Как вы создаете пользователей в Firebase - через консоль Firebase или каким-либо другим способом? Как QR-код попадает в firebase? У вас есть структура Firebase, в которой хранятся QR-коды? Дайте нам больше информации, и, возможно, мы сможем помочь.
У меня есть список пользователей с их идентификаторами в электронной таблице. Сценарий приложения помещает данные в созданную мной структуру базы данных firebase. Я думаю, это похоже на создание пользователей в Firebase вручную?
как я уже упоминал, не могли бы вы включить свою структуру базы данных?
@Jay Только что добавил структуру firebase, которую я использую прямо сейчас. Надеюсь, это поможет ответить на мой вопрос.
Если у вас есть сценарий, который отправляет данные в firebase (на узел пользователей), это совершенно не связано с созданием пользователей вручную. Эти данные - просто данные и не имеют ничего общего с пользователем в Firebase. То, как вы это делаете, очень небезопасно и идет в обход безопасной аутентификации Firebase, поэтому не рекомендуется. Тем не мение. Если ваша реализация должна быть такой, как насчет создания пользователей в консоли Firebase и использования этого uid в качестве QR-кода? Опять же, не рекомендуется, но тогда у вас может быть общий пароль для всех пользователей, но у каждого пользователя будет хотя бы свой собственный UID, и вы можете использовать правила Firebase.

Вы должны указать это в своем правиле безопасности firebase
{
"rules": {
".read": "auth !== null",
".write": "auth !== null"
}
}
Но как мне авторизовать пользователя? В моем приложении нет регистрации. Пользователи просто входят в систему с помощью предоставленного им уникального идентификатора.
Не уверен, что этот ответ действительно применим к вопросу. OP спрашивает, как аутентифицировать пользователей с помощью QR-кода, и все это гарантирует, что пользователь аутентифицирован для чтения и записи.
Добро пожаловать в SO. Вопрос немного неясный; вы спрашиваете, как создать правило безопасности? Если это так, правила напрямую связаны с тем, к чему вы хотите, чтобы пользователи имели доступ, поэтому нам нужно знать это, чтобы ответить. Если еще чего-то спрашиваешь, непонятно. Можете ли вы обновить свой вопрос, чтобы мы знали, о чем вы на самом деле спрашиваете? Чтобы задавать вопросы, ознакомьтесь с двумя следующими руководствами: Как мне задать хороший вопрос? и Как создать минимальный, полный и проверяемый пример.