2017-07-05 1 views
0

Dites mes Firebase règles de base de données ressemblent à ceci:Firebase règles de base de données - Donner accès utilisateur non authentifié à lire SEULEMENT chemin spécifique

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

Dans mon application, je dois vérifier si un nom d'utilisateur est déjà pris, et donc j'ai besoin pour ce faire avant d'authentifier l'utilisateur. Je suis conscient que je pouvais faire quelque chose comme ceci:

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

Cependant, si je comprends comment les règles fonctionnent correctement, ce qui fera que le chemin lisible et par défaut « Les utilisateurs » tous les chemin sera réglé sur ".read": false. Ma question est donc de savoir comment rendre chaque chemin lisible par un utilisateur authentifié, et rendre un utilisateur non authentifié uniquement capable de lire les données du chemin "Utilisateurs" et rien d'autre.

+0

Par tous les autres chemins, voulez-vous dire tous les autres chemins dans "Utilisateurs" comme '/ Users/user1/name'? Ou voulez-vous dire un autre chemin qui ne contient pas "Utilisateurs"? –

+0

Pourquoi faites-vous cela? Il n'y a aucune raison de vérifier si un nom d'utilisateur est utilisé - L'authentification Firebase gère les connexions pour vous et n'autorise pas les doublons. – Jay

Répondre

1

Certainement vous pouvez faire en sorte qu'un chemin dans la base de données est lisible pour les utilisateurs non authentifiés, mais je ne le recommanderais pas. Il n'est pas idéal de permettre à quiconque de lire les noms d'utilisateur de tous vos utilisateurs. Une autre option est que vous pouvez d'abord créer un utilisateur et ensuite lui demander de choisir un nom d'utilisateur une fois authentifié, mais alors vous devrez trouver comment vous voulez gérer les utilisateurs qui sont authentifiés, mais quittez l'application avant de choisir un Nom d'utilisateur.

Une meilleure option consiste à utiliser Cloud Functions for Firebase avec un déclencheur HTTP et à transmettre le nom d'utilisateur souhaité dans le cadre de la demande. La requête inclura une requête du nom d'utilisateur désiré et la réponse retournera si le nom d'utilisateur est disponible ou non. Il pourrait ressembler à ceci:

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 
admin.initializeApp(functions.config().firebase); 

exports.uniqueUsername = functions.https.onRequest((req, res) => { 
    const username = req.query.username 
    admin.database().ref('users').orderByChild('username').equalTo(username)once('value').then(snap => { 
     // if the child exists, then the username is taken 
     if (snap.exists()) { 
      res.send('username not available'); 
     } else { 
      res.send('username available'); 
     } 
    }) 
} 

Si vous êtes nouveau aux fonctions Cloud pour Firebase, puis vérifier ces ressources:

Getting Started with Cloud Functions for Firebase - YouTube

Cloud Functions for Firebase Documentation

Cloud Functions Samples

Timing Cloud Functions for Firebase using an HTTP Trigger and Cron - YouTube

+0

Ça a l'air génial! Je vais aller lire à propos de Cloud Functions, merci beaucoup! –