Не удается получить доступ к базе данных Firebase с помощью пользовательского токена - PullRequest
0 голосов
/ 12 сентября 2018

По какой-то причине, когда я тестирую свои правила доступа к БД, это хорошо работает на симуляторе firebase.Но когда я пробую это в моем коде, это не работает, значение никогда не возвращается.Если я изменю правила, чтобы разрешить глобальное чтение, как показано ниже, код снова начнет работать.

{
  "rules": {
    ".read":"true"
   }
}

Поэтому я считаю, что ошибка не в самих правилах, а в какой-то момент во время аутентификации.Самое странное, что когда я запускаю

firebase.auth().currentUser.uid

, он возвращает ожидаемое значение

"0x17d54a755b1bccbe23c6834a38f511c055e67a71"

Я уже проверил документы

https://firebase.google.com/docs/database/security/securing-data https://firebase.google.com/docs/auth/admin/create-custom-tokens

Но мне не удалось найти проблему

Это правила доступа.

{
  "rules": {
    "NFC":{
      "$mainProductKey":{
        ".write":"root.child('brands').child(auth.uid).child($mainProductKey).exists()"
      },
      ".write":"root.child('brands').child(auth.uid).child('products').exists()",
      ".read":"true"
    },
    "brands":{
      "$uid":{
        ".read": "$uid == auth.uid",
        ".write": "$uid == auth.uid"
      }
    },
  }
}

это часть моей структуры БД

{
  "NFC" : {
    ...
  },
  "brands" : {
    "0x17d54A755b1BCcBe23C6834A38F511c055e67a71" : {
      "unlocked" : true
    }
  }
}

это моя полезная нагрузка токена JWT

{
  "uid": "0x17d54a755b1bccbe23c6834a38f511c055e67a71",
  "iat": 1536771364,
  "exp": 1536774964,
  "aud": "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
  "iss": "firebase-adminsdk-u3222@deverytest-3d280.iam.gserviceaccount.com",
  "sub": "firebase-adminsdk-u3222@deverytest-3d280.iam.gserviceaccount.com"
}

это код, который не возвращается после добавления правил

export function loadAccountLock (brandAddress) {
  return new Promise((resolve, reject) => {
    firebase.database().ref(`brands/${brandAddress}/`).once('value', function (snapshot) {
      let brand = snapshot.val() || {}
      resolve(!!brand.unlocked)
    })
  })
}

и я проверяюпользователи

firebase.auth().signInWithCustomToken(token)

1 Ответ

0 голосов
/ 22 сентября 2018

Я понял, в чем проблема. На самом деле я отправлял строчный адрес Ethereum внутри токена, но ключи, которые у меня были в моей БД, были прописными. Поскольку правила Firebase чувствительны к регистру, я получил разрешение на чтение Отказано.

Короче не было проблем с правилами или с кодом авторизации

...