[javascript] 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 콘솔 의 프로젝트에있는 데이터베이스는 관리 사용자 (예 : Cloud Functions 또는 Admin SDK를 사용하는 프로세스) 만 읽고 쓸 수 있습니다. 일반 클라이언트 측 SDK의 사용자는 서버 측 보안 규칙을 변경하지 않는 한 데이터베이스에 액세스 할 수 없습니다.


인증 된 사용자 만 데이터베이스를 읽고 쓸 수 있도록 규칙을 변경할 수 있습니다.

{
  "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는 요즘 실시간 데이터베이스가 아닌 클라우드 스토어를로드합니다. 실시간으로 전환하고 올바른 규칙을 적용해야합니다.

여기에 이미지 설명 입력

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

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


답변

언급 한 “데이터베이스”옵션으로 이동합니다.

  1. 파란색 헤더에 Cloud Firestore Beta라는 드롭 다운이 있습니다.
  2. “실시간 데이터베이스”로 변경하십시오.
  3. 규칙으로 이동하여 .write .read 모두를 true로 설정하십시오.

여기 에서 복사했습니다 .


답변

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

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

실시간 데이터베이스를 선택하고 규칙으로 이동

규칙을 true로 변경하십시오.

이것은 내 문제를 해결했습니다.


답변

  1. firebase를 열고 왼쪽에서 데이터베이스를 선택합니다.
  2. 이제 오른쪽에있는 드롭 다운에서 [실시간 데이터베이스]를 선택하고 규칙을 { “rules”: { “.read”: true, “.write”: true}}로 변경합니다.

효과가있다..!!


답변

좋습니다.하지만 전체 실시간 데이터베이스를 열고 싶지는 않습니다! 이와 같은 것이 필요합니다.

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

또는

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


답변

또 다른 해결책은 자격 증명이 이미 있으면 자동으로 사용자를 생성하거나 로그인하는 것입니다. 다음은 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);
        });
}