Je suis relativement nouveau en codage et j'ai des problèmes.
J'ai ce code pour envoyer des données à firebase
app.userid = app.user.uid
var userRef = app.dataInfo.child(app.users);
var useridRef = userRef.child(app.userid);
useridRef.set({
locations: "",
theme: "",
colorScheme: "",
food: ""
});
Cependant, je continue à avoir l'erreur:
AVERTISSEMENT FIREBASE: échec défini sur/users/(GoogleID): permission_denied 2016-05-23 22: 52: 42.707 firebase.js: 227 Non capturé (promis) Erreur: PERMISSION_DENIED: autorisation refusée (…)
Lorsque j'essaie de regarder cela, il parle de règles pour Firebase, qui semble être dans un langage que je n'ai pas encore appris (ou que je ne fais que passer par-dessus ma tête). Quelqu'un peut-il expliquer ce qui cause le problème? Je pensais que c’était parce que je lui demandais de stocker les courriels et le nom d’affichage de l’utilisateur. Vous n’êtes tout simplement pas autorisé à le faire, mais lorsque j’ai retiré ces informations, j’avais toujours le même problème. Existe-t-il un moyen d’éviter cette erreur sans fixer de règles, ou bien est-ce que je peux apprendre moi-même à écrire des règles en une journée, ou suis-je tout simplement sorti de ma ligue?
Merci pour toute aide!
Par défaut, la base de données d'un projet de la nouvelle console Firebase est uniquement lisible/accessible en écriture par les utilisateurs authentifiés:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
Voir le démarrage rapide pour les règles de sécurité de la base de données Firebase .
Puisque vous ne connectez pas l'utilisateur à partir de votre code, la base de données vous interdit d'accéder aux données. Pour résoudre ce problème, vous devez autoriser l'accès non authentifié à votre base de données ou vous connecter à l'utilisateur avant d'accéder à la base de données.
La solution la plus simple pour le moment (jusqu'à ce que le didacticiel soit mis à jour) consiste à accéder au panneau Base de données de la console de votre projet, à sélectionner l'onglet Règles et à remplacer le contenu par ces règles:
{
"rules": {
".read": true,
".write": true
}
}
Cela rend votre nouvelle base de données lisible et accessible en écriture à toute personne connaissant l'URL de la base de données. Assurez-vous de sécuriser à nouveau votre base de données avant de commencer la production, sinon quelqu'un risque de commencer à en abuser.
Pour une solution (légèrement) plus lente, mais plus sûre, appelez l'une des méthodes signIn...
de Authentification Firebase pour vous assurer que l'utilisateur est connecté avant d'accéder à la base de données. Le moyen le plus simple de le faire est en utilisant l'authentification anonyme :
firebase.auth().signInAnonymously().catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// ...
});
Et puis attachez vos auditeurs lorsque la connexion est détectée
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
var isAnonymous = user.isAnonymous;
var uid = user.uid;
var userRef = app.dataInfo.child(app.users);
var useridRef = userRef.child(app.userid);
useridRef.set({
locations: "",
theme: "",
colorScheme: "",
food: ""
});
} else {
// User is signed out.
// ...
}
// ...
});
Je faisais face à un problème similaire et j'ai découvert que cette erreur était due à des règles incorrectes définies pour les opérations de lecture/écriture pour la base de données en temps réel. Par défaut, google firebase charge de nos jours la base de données Cloud Store en temps réel. Nous devons passer en temps réel et appliquer les règles appropriées.
Comme nous pouvons le voir, il est indiqué que la base de données Cloud Firestore n'est pas une base de données en temps réel. Une fois que vous avez basculé sur la base de données correcte, appliquez les règles ci-dessous:
{
"rules": {
".read": true,
".write": true
}
}
WORKING!!
Go to the "Database" option you mentioned.
1. There on the Blue Header you'll find a dropdown which says Cloud Firestore Beta
2. Change it to "Realtime database"
3. Go to Rules and set .write .read both to true
Let me know how it goes.
copied from
https://github.com/firebase/quickstart-js/issues/239
Aller à la base de données, à côté du titre il y a 2 options:
Cloud Firestore, base de données en temps réel
Sélectionnez la base de données en temps réel et allez aux règles
changer les règles en true.
Cela a résolu mon problème.
ça marche..!!
Une autre solution consiste à créer ou à connecter automatiquement l'utilisateur si vous disposez déjà des informations d'identification. Voici comment je le fais avec Plain JS.
function loginToFirebase(callback)
{
let email = '[email protected]';
let password = 'xxxxxxxxxxxxxx';
let config =
{
apiKey: "xxx",
authDomain: "xxxxx.firebaseapp.com",
projectId: "xxx-xxx",
databaseURL: "https://xxx-xxx.firebaseio.com",
storageBucket: "gs://xx-xx.appspot.com",
};
if (!firebase.apps.length)
{
firebase.initializeApp(config);
}
let database = firebase.database();
let storage = firebase.storage();
loginFirebaseUser(email, password, callback);
}
function loginFirebaseUser(email, password, callback)
{
console.log('Logging in Firebase User');
firebase.auth().signInWithEmailAndPassword(email, password)
.then(function ()
{
if (callback)
{
callback();
}
})
.catch(function(login_error)
{
let loginErrorCode = login_error.code;
let loginErrorMessage = login_error.message;
console.log(loginErrorCode);
console.log(loginErrorMessage);
if (loginErrorCode === 'auth/user-not-found')
{
createFirebaseUser(email, password, callback)
}
});
}
function createFirebaseUser(email, password, callback)
{
console.log('Creating Firebase User');
firebase.auth().createUserWithEmailAndPassword(email, password)
.then(function ()
{
if (callback)
{
callback();
}
})
.catch(function(create_error)
{
let createErrorCode = create_error.code;
let createErrorMessage = create_error.message;
console.log(createErrorCode);
console.log(createErrorMessage);
});
}