2017-12-12 4 views
1

Ich habe eine eckige App, die Firebase verwendet, um Benutzer auf dem Client zu authentifizieren. Dies scheint richtig zu funktionieren.Wie authentifiziere ich Benutzer auf dem Server mit Firebase, wenn sie bereits auf dem Client authentifiziert sind?

export class AuthService { 
    user$: Observable<firebase.User>; 

    constructor(private af_auth: AngularFireAuth) { 
    this.user$ = this.af_auth.authState; 
    this.user$.subscribe(user => { 
     // do something with the firebase user 
    }); 
    } 

} 

Ich habe auch einige Server-basierte Sachen in node.js mit Express ausgeführt. Ich möchte versuchen zu überprüfen, dass der Benutzer, der meinen Endpunkt trifft, bereits über Firebase mit meiner App authentifiziert wurde. Darf ich das machen?

Ich möchte eine Route-Handler wie dies in Express, etwas haben:

var firebase_app = firebase.initializeApp(firebase_config); 

auth.isAuthenticated = function (req, res, next) { 

    // I had seen a suggestion to do the following, but currentUser is always null here. 
    var user = firebase_app.auth().currentUser; 

    if (user !== null) { 
     // Authenticated with my app? 
     req.auth_user = user; 
     next(); 
    } else { 
     res.status(401).send({error: 'Nope'}); 
    } 
}; 

Wie kann ich aus der Schnellstraße Handler sagen, dass meine Benutzer in meiner App angemeldet ist?

Antwort

1

Schritt 1 eckig. Senden Sie das Firebase Auth ID-Token in der Kopfzeile von eckig an Ihren Express-Endpunkt.

postRequest() { 
    const url = 'https://your-endpoint'; 
    firebase.auth().currentUser.getIdToken() 
      .then(authToken => { 
       const headers = new Headers({'Authorization': 'Bearer ' + authToken }); 
       return this.http.post(url, { someData } , { headers }).toPromise() 
      }) 
    } 

Schritt 2 Knoten. Entschlüsseln Sie das Authentifizierungs-Token mit dem Firebase Admin SDK. verifyIdToken überprüft das Firebase ID Token (JWT). Wenn das Token gültig ist, wird das Versprechen mit den dekodierten Ansprüchen des Tokens erfüllt. Andernfalls wird das Versprechen abgelehnt.

const admin = require('firebase-admin'); 
admin.initializeApp(yourConfig); 
const express = require('express') 
const app = express() 

app.post('/your-endpoint', (req, res) => { 

    const token = req.headers.authorization.split('Bearer ')[1] 

    return admin.auth().verifyIdToken(token) 
       .then(decodedToken => { 
        const uid = decodedToken.uid; 
        res.status(200).send('Looks good!') 

       }) 
       .catch(err => res.status(403).send('Unauthorized')) 


}); 

Quellen:

https://jwt.io/

https://firebase.google.com/docs/auth/admin/verify-id-tokens https://angularfirebase.com/lessons/secure-firebase-cloud-functions/

+0

Das ist perfekt. Vielen Dank! –

Verwandte Themen