programing

Firebase 권한 거부됨

muds 2023. 7. 20. 22:11
반응형

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

하지만 계속 오류가 발생합니다.

파이어베이스 경고: /users/(Google)로 설정ID) 실패: permission_denied 2016-05-23 22:52:42.707 firebase.js:227 Uncaught (약속 없음) 오류: PERMISSION_DENIED: 권한 거부(…)

제가 이것을 검색하려고 하면 Firebase에 대한 규칙에 대해 이야기합니다. Firebase는 제가 아직 배우지 않은 언어로 되어 있는 것 같습니다(또는 제가 이해할 수 없는 수준입니다).누가 이 문제의 원인을 설명할 수 있습니까?저는 이메일과 사용자 표시 이름을 저장하기 위해 요청하는 것이라고 생각했는데, 당신은 이것을 할 수 없었습니다. 하지만 제가 그것들을 꺼냈을 때도 여전히 같은 문제가 있었습니다.규칙을 설정하지 않고 이 오류를 피할 수 있는 방법이 있을까요, 아니면 규칙이 하루 만에 스스로에게 글 쓰는 법을 가르칠 수 있는 것일까요, 아니면 제가 제 능력 밖에 있는 것일까요?

도와주셔서 감사합니다!

기본적으로 Firebase Console의 프로젝트 데이터베이스는 관리 사용자(예: Cloud Functions 또는 Admin SDK를 사용하는 프로세스)만 읽고 쓸 수 있습니다.일반 클라이언트 측 SDK 사용자는 서버 측 보안 규칙을 변경하지 않으면 데이터베이스에 액세스할 수 없습니다.


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

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

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

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

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

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

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

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

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

많이 더 (으)로하십시오.signIn...데이터베이스에 액세스하기 전에 사용자가 로그인했는지 확인하는 Firebase Authentication 방법입니다.가장 간단한 방법은 익명 인증을 사용하는 것입니다.

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

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

enter image description here

Cloud Firestore가 실시간 데이터베이스가 아님을 알 수 있듯이 올바른 데이터베이스로 전환되면 아래 규칙을 적용합니다.

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

참고:

규칙을 조심하세요.를 기읽및쓰다로설정으음으로 true데이터베이스를 기도하는 눈에 취약하게 만듭니다.

자세히 보기:

https://firebase.google.com/docs/database/security

언급한 "데이터베이스" 선택사항으로 이동합니다.

  1. 파란색 머리글에 Cloud Firestore 베타라는 드롭다운이 표시됩니다.
  2. 실시간 데이터베이스로 변경
  3. 규칙으로 이동하고 .write.read both를 true로 설정합니다.

여기서 복사했습니다.

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

클라우드 Firestore, 실시간 데이터베이스

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

규칙을 참으로 변경합니다.

좋습니다. 하지만 전체 실시간 데이터베이스를 열고 싶지는 않을 것입니다!이런 게 필요해요.

{
  /* 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"
      }
    }
  }
}
  1. 화력 기지를 열고 왼쪽에 있는 데이터베이스를 선택합니다.
  2. 이제 오른쪽에서 익사체에서 [실시간 데이터베이스]를 선택하고 규칙을 다음과 같이 변경합니다.
{
  "rules": {
    ".read": true,
    ".write": true
  }
}

또 다른 해결책은 자격 증명을 이미 사용할 수 있는 경우 사용자를 자동으로 만들거나 로그인하는 것입니다.다음은 플레인 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);
        });
}

제공된 Firebase 프로젝트 ID가 올바르지 않은 경우에도 PermissionDenied가 나타날 수 있습니다.

프로젝트 ID를 확인하려면 이 안내서를 참조하십시오.

Firebase 콘솔:설정 프로젝트 설정을 클릭합니다.프로젝트 ID가 위쪽 창에 표시됩니다.

무료 계정 제한으로 인해 파이어베이스에서 이전 프로젝트를 재사용하려는 경우 데이터베이스 규칙이 오래된 것일 수 있습니다.

제 경우 401 Unauthorized 오류가 발생했는데 읽기 및 쓰기 규칙을 true로 설정하면 해결되었습니다.

이 훌륭한 커뮤니티에 감사드립니다!

브라질의 존경을 표합니다!

저도 같은 문제를 겪고 있었습니다. 클라우드 대신 실시간 데이터베이스를 사용하고 있는지 확인하십시오.그런 다음 다음 모든 사용자에게 액세스를 허용하도록 규칙을 변경합니다.

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

기본적으로 Firestore 데이터베이스는 관리자가 데이터베이스에서 읽고 쓸 수만 있으므로 읽기/쓰기 규칙이 false로 설정됩니다.

언급URL : https://stackoverflow.com/questions/37403747/firebase-permission-denied

반응형