• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage Firebase Storage mit NodeJS

ineedmny

Mitglied
Hallo Zusammen,

meine App ist so gut wie fertig, aber jetzt kämpfe ich noch mit den Berechtigungen von Firebase rum.
Ich verwende die Realtime Database und den Storage. Beides funktioniert soweit sehr gut.

Aufbau der App:
Ionic 1 + Angular 1, NodeJS, Firebase
Zu meinem Problem:
Bisher habe ich die Profilbilder der User Client-seitig mit dem Firebase SDK hochgeladen und anschließend die Download-URL mit ".getDownloadURL" geholt und in der Datenbank beim jeweiligen User gespeichert.
Weil ich aber alle Datei- und Datenbank-Operationen in NodeJS erledigen will, verwende ich jetzt das Google Cloud Platform SDK. Nach ein wenig lesen, bin ich dann zu folgendem Ergebnis gekommen:

Code:
router.post('/savePicture', multer.single('file'), function(req, res, next) {
    
    if (!req.file) {
        res.status(400).send('No file uploaded.');
        return;
    }

    var uid = req.user.sub;
    var filename = uuidV4() + '.' + req.file.originalname.split('.').pop();
    var fullPath = 'users/images/' + filename;

    // Create a new blob in the bucket and upload the file data.
    var blob = bucket.file(fullPath);

    var blobStream = blob.createWriteStream({
          metadata: {
            'contentType': req.file.mimetype
          }
    });

    blobStream.on('error', (err) => {
        res.status(200).send(err);
        return;
    });

    blobStream.on('finish', () => {
        // The public URL can be used to directly access the file via HTTP.
        var publicUrl = 'https://storage.googleapis.com/' + bucket.name + '/' + blob.name;

        blob.makePublic(function(err, apiResponse) {
            console.log('makePublic err', err)
            console.log('apiResponse', apiResponse)

            var userRef = admin.database().ref('users').child(uid);
            userRef.once('value', function(snapshot) {
                var user = snapshot.val();

                // Wenn user vorhanden, dann publicUrl speichern
                if(user !== null) {
                    userRef.update({
                        picture: publicUrl
                    })
                }
                
                res.status(200).send({result: true, url: publicUrl});
            })
        });

            

    });

    blobStream.end(req.file.buffer);

});


Das funktioniert auch soweit: das Bild wird erfolgreich hochgeladen und die "publicUrl" wird in der Datenbank hinterlegt. Und weil ich am Schluss noch die Funktion ".makePublic" verwende, ist das Bild jetzt auch über die gespeicherte Url abrufbar, ABER somit kann ja jetzt absolut jeder (auch außerhalb der App) auf alle Bilder zugreifen.

Ich will aber, dass nur angemeldete User Zugriff auf die Bilder haben.
SDCVJDx.png


Wenn ich das richtig verstanden habe, dann gelten diese Regeln nur für das Firebase SDK, also für den Client-seitigen Zugriff auf den Storage, aber wenn das wirklich so ist, was muss ich dann verändern, dass die Bilder nur für angemeldete User innerhalb meiner App abrufbar sind?

Abgesehen von den Profilbildern, gibt es in meiner App auch noch andere Bilder, die (streng genommen) auch nur für bestimmte User abrufbar sein sollen.

Ich steh im Moment echt auf der Leitung und freue mich, wenn mir jemand auf die Sprünge helfen kann :-)


Vielen Dank!!
 
Werbung:
Zurück
Oben