Функция FireBase возвращает 403 при выполнении HTTP-запроса - PullRequest
0 голосов
/ 29 марта 2020

Я начал работать над этим приложением node.js, используя express для отправки данных датчика через http-запрос в мою базу данных (из arduino, чтобы указать c). Основная цель приложения - получить значения датчиков из URL и создать новый документ в моем облачном пожарном хранилище.

var admin = require('firebase-admin');
const functions = require('firebase-functions');
const cors = require('cors')({origin: true});
const express = require('express');
var serviceAccount = require("./minicapcollar-firebase-adminsdk-ovdpm-cda3767493.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://minicapcollar.firebaseio.com"
});

let db = admin.firestore();

const app = express();
app.use(cors);

//Declare the field view for the timestamp
let FieldValue = require('firebase-admin').firestore.FieldValue;

app.get('/send/sensorData', (req, res) => {
    var id = 'HpwWiJSGHNbOgJtYi2jM'; //variable to store the id of the collar, TODO: req.query.id
    var lat = req.query.lat/1000000;
    var lon = req.query.lon/1000000;
    var hr = req.query.hr;
    var et = req.query.et;
    var it = req.query.it;
    //Rest of the values

    //Declare the index of the collar id
    let indexRef = db.collection('dogs').doc(id);

    //Declare the index of the position
    let posRef = indexRef.collection('position').doc();

    //Declare the index of the heartrate
    let hrRef = indexRef.collection('heartrate').doc();

    //Declare the index of the external temperature
    let etRef = indexRef.collection('external_temperature').doc();

    //Declare the index of the internal temperature
    let itRef = indexRef.collection('temperature').doc();

    //Save the current time
    var time = FieldValue.serverTimestamp();

    //Set position
    let setPos = posRef.set({
        timestamp: time,
        value: new admin.firestore.GeoPoint(lat,lon)
    }).then(function() {
        console.log("Position data saved to Firestore");
        return null;
    }).catch(function(error) {
        console.log("Got an error: ", error);
    });

    //Set heartrate
    let setHr = hrRef.set({
        timestamp: time,
        value: hr
    }).then(function() {
        console.log("Heartrate data saved to Firestore");
        return null;
    }).catch(function(error) {
        console.log("Got an error: ", error);
    });

    //Set external temperature
    let setET = etRef.set({
        timestamp: time,
        value: et
    }).then(function() {
        console.log("External temperature data saved to Firestore");
        return null;
    }).catch(function(error) {
        console.log("Got an error: ", error);
    });

    //Set internal temperature
    let setIT = itRef.set({
        timestamp: time,
        value: it
    }).then(function() {
        console.log("Data saved to Firestore");
        return null;
    }).catch(function(error) {
        console.log("Got an error: ", error);
    });


    res.send(`All sensor data sent`);


});

app.get('/send/pos', (req, res) => {
    var id = 'HpwWiJSGHNbOgJtYi2jM'; //variable to store the id of the collar, TODO: req.query.id
    var lat = req.query.lat/1000000;
    var lon = req.query.lon/1000000;
    //Rest of the values

    //Declare the index of the collar id
    let indexRef = db.collection('dogs').doc(id);

    //Declare the index of the position
    let posRef = indexRef.collection('position').doc();

    //Save the current time
    var time = FieldValue.serverTimestamp();

    //Set position
    let setPos = posRef.set({
        timestamp: time,
        value: new admin.firestore.GeoPoint(lat,lon)
    }).then(function() {
        console.log("Position data saved to Firestore");
        return null;
    }).catch(function(error) {
        console.log("Got an error: ", error);
    });

    res.send(`Position sent`);
});

app.get('/send/hr', (req, res) => {
    var id = 'HpwWiJSGHNbOgJtYi2jM'; //variable to store the id of the collar, TODO: req.query.id
    var hr = req.query.hr;

    //Declare the index of the collar id
    let indexRef = db.collection('dogs').doc(id);

    //Declare the index of the heartrate
    let hrRef = indexRef.collection('heartrate').doc();

    //Save the current time
    var time = FieldValue.serverTimestamp();

    //Set heartrate
    let setHr = hrRef.set({
        timestamp: time,
        value: hr
    }).then(function() {
        console.log("Heartrate data saved to Firestore");
        return null;
    }).catch(function(error) {
        console.log("Got an error: ", error);
    });

    res.send(setHr & `Heartrate value sent`);
});

app.get('/send/temp', (req, res) => {
    var id = 'HpwWiJSGHNbOgJtYi2jM'; //variable to store the id of the collar, TODO: req.query.id
    var et = req.query.et;
    var it = req.query.it;

    //Declare the index of the collar id
    let indexRef = db.collection('dogs').doc(id);

    //Declare the index of the external temperature
    let etRef = indexRef.collection('external_temperature').doc();

    //Declare the index of the internal temperature
    let itRef = indexRef.collection('temperature').doc();

    //Save the current time
    var time = FieldValue.serverTimestamp();

    //Set external temperature
    let setET = etRef.set({
        timestamp: time,
        value: et
    }).then(function() {
        console.log("External temperature data saved to Firestore");
        return null;
    }).catch(function(error) {
        console.log("Got an error: ", error);
    });

    //Set internal temperature
    let setIT = itRef.set({
        timestamp: time,
        value: it
    }).then(function() {
        console.log("Data saved to Firestore");
        return null;
    }).catch(function(error) {
        console.log("Got an error: ", error);
    });

    res.send(`Temperature values sent`);
});

exports.app = functions.https.onRequest(app);

Как только я закончил приложение, я протестировал его на своем локальном хосте, и он работал отлично. Я смог без проблем записать новые данные в облачный пожарный магазин. После развертывания приложения при отправке запроса я получаю 403 (ошибка: запрещено. У вашего клиента нет разрешения на получение URL / app / send / pos /? Lat = 11111111 & lon = 22222222 с этого сервера.)

В правилах пожарного депо я указал, что любой может читать и писать, чтобы увидеть, если это было проблемой, но проблема сохраняется.

Я также пытался следовать этому уроку: https://www.youtube.com/watch?v=LOeioOKUKI8, но у меня возникла та же проблема при попытке получить доступ к "http://baseURL.firebaseapp.com/timestamp", при развертывании я получил ошибку 403 (на локальном хосте это тоже отлично работало)

ПРИМЕЧАНИЕ. Это Мой первый опыт работы с node.js, пожалуйста, прости любые плохие практики. Я студент-электрик, поэтому программирование - не моя главная сила. ЗАРАНЕЕ СПАСИБО ЗА ПОМОЩЬ!

1 Ответ

0 голосов
/ 29 марта 2020

Спасибо samthecodingman ! ответ , который вы предоставили, сделал свое дело! Проблема была в конфигурации IAM моей функции.

Для тех из вас, кто еще не хочет переходить на другую ссылку, я цитирую ответ, предоставленный Mike Karp в ссылке выше.

Мне кажется, что дополнительные функции IAM были добавлены в облачные функции Google, и> в результате вы, возможно, не включили доступ allUser к функции (к вашему сведению, это дает> доступ к вся сеть).

  1. На домашней странице облачных функций выделите облачную функцию, для которой вы хотите добавить все >> доступ.
  2. Нажмите «Показать информационную панель» на вверху справа.
  3. Нажмите «Добавить участников» и введите «allUsers», затем выберите «Cloud Function Invokers» в разделе >> «Cloud Function» в поле Role.
  4. Нажмите «Save»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...