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


123

나는 비교적 코딩이 처음이고 문제가 있습니다.

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

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

답변:


250

기본적으로 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.
    // ...
  }
  // ...
});

1
감사합니다- 이 Ember 튜토리얼 에서 Firebase 권한 문제를 진행 하기 위해 안전하지 않은 수정 사항을 사용하고 유사한 질문에 대한 답변을 인용했습니다 . 그러나 (보안) 익명 인증 코드는 어디에 추가합니까?
Dave Everitt

2
OMG 한 시간 간다. 나는 거기에 이것을 가지고 있었지만 값은 FALSE였습니다. 나는 그것을 간과했습니다. TRUE와 빵로 변경, 응용 프로그램은 작동하고 당신이 ... 생각하는 것처럼
앤디

OMG, 나도 fn은 둘 다 이미 false로 설정되었을 때 권한에 실패한 이유를 파악할 수 없었습니다 (댓글을 읽을 때까지). 이런, 멍청한 실수., 대중에게 공개 할 때 둘 다 사실이어야합니다 (읽기). 자신의 오류를 지적 해주셔서 감사합니다. 기록을 위해 규칙을 ".read": true로 변경 한 다음 작동하기 시작했습니다.
contractorwolf

@Andy 감사합니다 사람, 나에게 동일하고 귀하의 의견을보고 방금 내 문제를 해결했습니다.)
Mahmudul Hasan Sohag

86

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

여기에 이미지 설명 입력

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

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

3
젠장 UI! 나는 하루 종일 규칙이 다른 이유를 알아 내고 ... 아 ... "구름 소방서"를위한 거였어 ... 고마워!
Alexey Volodko 19

43

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

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

여기 에서 복사했습니다 .


11

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

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

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

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

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


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

효과가있다..!!


5
이것은 이미 다른 답변에서 언급되었습니다. 또한 이것을 제안 할 때 이것이 저장되지 않기 때문에 경고를 추가하십시오!
André Kool 2018 년

4

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

{
  /* 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"
      }
    }
  }
}

2

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

이것은 정말 나쁜 보안 현명합니다.
ASH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.