【问题标题】:NodeJS Firestore Authentication - Permission DeniedNodeJS Firestore 身份验证 - 权限被拒绝
【发布时间】:2019-01-21 13:37:15
【问题描述】:

我正在尝试创建一个客户端脚本,允许某人登录到他们的 Google 帐户,然后在他们通过身份验证后访问 Firestore 数据库。使用 firebase.auth 登录后,除了某些原因之外,一切正常,它没有将此数据传递给 firebase.firestore 以表示它们已通过身份验证。

这是我正在使用的脚本,唯一失败的部分是当我尝试添加到 Firestore 集合时。

const firebase = require ("firebase/app");
require("firebase/auth");
require("firebase/firestore");

const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');
const util = require('util')

var config = {
    **HIDDEN**
};
firebase.initializeApp(config);

const SCOPES = ['email','profile'];
const TOKEN_PATH = 'token.json';

fs.readFile('credentials.json', (err, content) => {
  if (err) return console.log('Error loading client secret file:', err);
  // Authorize a client with credentials, then call the Gmail API.
  authorize(JSON.parse(content), listLabels);
});

function authorize(credentials, callback) {
  const {client_secret, client_id, redirect_uris} = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(
      client_id, client_secret, redirect_uris[0]);

  // Check if we have previously stored a token.
  fs.readFile(TOKEN_PATH, (err, token) => {
    if (err) return getNewToken(oAuth2Client, callback);
    oAuth2Client.setCredentials(JSON.parse(token));
    callback(oAuth2Client);
  });
}

function getNewToken(oAuth2Client, callback) {
  const authUrl = oAuth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES,
  });
  console.log('Authorize this app by visiting this url:', authUrl);
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });
  rl.question('Enter the code from that page here: ', (code) => {
    rl.close();
    oAuth2Client.getToken(code, (err, token) => {
      if (err) return console.error('Error retrieving access token', err);
      oAuth2Client.setCredentials(token);
      // Store the token to disk for later program executions
      fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
        if (err) return console.error(err);
        console.log('Token stored to', TOKEN_PATH);
      });
      callback(oAuth2Client);
    });
  });
}

function listLabels(auth) {
    var credential = firebase.auth.GoogleAuthProvider.credential(auth.credentials.id_token);
    firebase.auth().signInAndRetrieveDataWithCredential(credential).catch(function(error) {
        var errorCode = error.code;
        var errorMessage = error.message;
        var email = error.email;
        var credential = error.credential;

        console.log(errorCode);
        console.log(errorMessage);
    });

    var firestore = firebase.firestore();
    firestore.settings({
        timestampsInSnapshots: true
    });

    firestore.collection("users").add({
        test: "Hello"
    });

    firebase.auth().signOut();
}

以下是我对数据库的规则,如果我将其更改为 if true;,它就可以正常工作。但我想确保只有经过身份验证的用户才能访问该数据库。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

【问题讨论】:

    标签: node.js firebase firebase-authentication google-cloud-firestore


    【解决方案1】:

    方法signInAndRetrieveDataWithCredential 返回一个promise,在访问Firestore 上的数据之前,您无需等待它完成,因此这可能是导致问题的原因。我相信这可能会奏效:

    function listLabels(auth) {
        var credential = firebase.auth.GoogleAuthProvider.credential(auth.credentials.id_token);
        firebase.auth().signInAndRetrieveDataWithCredential(credential)
            .then(user => {    
                var firestore = firebase.firestore();
                firestore.settings({
                    timestampsInSnapshots: true
                });
    
                firestore.collection("users").add({
                    test: "Hello"
                });
    
                firebase.auth().signOut();
            })
            .catch(function (error) {
                var errorCode = error.code;
                var errorMessage = error.message;
                var email = error.email;
                var credential = error.credential;
    
                console.log(errorCode);
                console.log(errorMessage);
            });
    }
    

    【讨论】:

    • 呃,我真是个白痴。我能找到的所有示例都只有身份验证部分和如何登录,没有一个包括 firestore 方面。这行得通。
    猜你喜欢
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2020-09-08
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2016-02-09
    相关资源
    最近更新 更多