programing

Firebase 권한이 거부되었습니다.

nasanasas 2020. 8. 24. 18:52
반응형

Firebase 권한이 거부되었습니다.


나는 비교적 코딩에 익숙하지 않고 문제가 있습니다.

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: ""
});

그러나 계속 오류가 발생합니다.

FIREBASE 경고 : / users / (GoogleID)로 설정 실패 : permission_denied 2016-05-23 22 : 52 : 42.707 firebase.js : 227 포착되지 않음 (약속) 오류 : PERMISSION_DENIED : 권한 거부 (…)

이걸 찾아 보려고하면 Firebase의 규칙에 대해 이야기하는데, 이는 제가 아직 배운 적이없는 언어로되어있는 것 같습니다. 누군가 문제의 원인을 설명 할 수 있습니까? 나는 이메일과 사용자 표시 이름을 저장하도록 요청한 것으로 생각했는데 당신은 이것을 할 수 없었지만 그것들을 꺼냈을 때 나는 여전히 똑같은 문제가있었습니다. 규칙을 설정하지 않고이 오류를 피할 수있는 방법이 있습니까? 아니면 하루에 작성하는 방법을 스스로 가르쳐 줄 수있는 규칙입니까, 아니면 그냥 리그에서 벗어난 것일까 요?

도움을 주셔서 감사합니다!


기본적으로 새 Firebase 콘솔 의 프로젝트에있는 데이터베이스는 인증 된 사용자 만 읽고 쓸 수 있습니다.

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

Firebase 데이터베이스 보안 규칙에 대한 빠른 시작을 참조하세요 .

코드에서 사용자를 로그인하지 않기 때문에 데이터베이스는 데이터에 대한 액세스를 거부합니다. 이를 해결하려면 데이터베이스에 대한 인증되지 않은 액세스를 허용하거나 데이터베이스에 액세스하기 전에 사용자로 로그인해야합니다.

데이터베이스에 대한 인증되지 않은 액세스 허용

현재 가장 간단한 해결 방법은 (튜토리얼이 업데이트 될 때까지) 프로젝트 콘솔의 데이터베이스 패널로 이동하여 규칙 탭을 선택하고 내용을 다음 규칙으로 바꾸는 것입니다.

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

이렇게하면 데이터베이스의 URL을 아는 모든 사람이 새 데이터베이스를 읽고 쓸 수 있습니다. 프로덕션에 들어가기 전에 데이터베이스를 다시 보호해야합니다. 그렇지 않으면 누군가가이를 악용 할 가능성이 있습니다.

데이터베이스에 액세스하기 전에 사용자 로그인

(약간) 시간이 더 걸리지 만 더 안전한 솔루션을 원하면 Firebase 인증signIn... 방법 중 하나를 호출 하여 데이터베이스에 액세스하기 전에 사용자가 로그인했는지 확인하세요. 이를 수행하는 가장 간단한 방법은 익명 인증을 사용하는 것입니다 .

firebase.auth().signInAnonymously().catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // ...
});

그런 다음 로그인이 감지되면 리스너를 연결합니다.

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.
    // ...
  }
  // ...
});

비슷한 문제에 직면했고이 오류는 실시간 데이터베이스의 읽기 / 쓰기 작업에 대해 잘못된 규칙이 설정 되었기 때문이라는 것을 알았습니다. 기본적으로 Google firebase는 요즘 실시간 데이터베이스가 아닌 클라우드 스토어를로드합니다. 실시간으로 전환하고 올바른 규칙을 적용해야합니다.

enter image description here

보시다시피 실시간 데이터베이스가 아닌 Cloud Firestore는 올바른 데이터베이스로 전환되면 아래 규칙이 적용됩니다.

{
   "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

데이터베이스로 이동하면 제목 옆에 두 가지 옵션이 있습니다.

Cloud Firestore, 실시간 데이터베이스

Select Realtime database and go to rules

change rules to true.

This solved my problem.


  1. Open firebase, select database on the left hand side.
  2. Now on the right hand side, select [Realtime database] from the dropdown and change the rules to: { "rules": { ".read": true, ".write": true } }

it works..!!


Another solution is to actually create or login the user automatically if you already have the credentials handy. Here is how I do it using Plain JS.

function loginToFirebase(callback)
{
    let email = 'xx@xx.com';
    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);
        });
}

OK, but you don`t want to open the whole realtime database! You need something like this.

{
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
    ".read": "auth.uid !=null",
    ".write": "auth.uid !=null"
  }
}

or

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

참고URL : https://stackoverflow.com/questions/37403747/firebase-permission-denied

반응형