我有一个角度应用程序,它使用firebase对客户端上的用户进行身份验证。这似乎工作正常。
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
});
}
}
我还在node.js中使用express运行一些基于服务器的东西。我想尝试验证用户点击我的端点的用户是否已经通过firebase对我的应用进行了身份验证。我可以这样做吗?
我希望有一个类似于此的路由处理程序:
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'});
}
};
如何从快递路由处理程序中告知我的用户已登录到我的应用程序?
答案 0 :(得分:3)
第1步角度。将标题中的Firebase Auth ID令牌从angular发送到您的express端点。
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()
})
}
步骤2节点。使用Firebase管理SDK解密身份验证令牌。 verifyIdToken
验证Firebase ID令牌(JWT)。如果令牌有效,则使用令牌的已解码声明来履行承诺;否则,承诺被拒绝。
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'))
});
来源:
https://firebase.google.com/docs/auth/admin/verify-id-tokens https://angularfirebase.com/lessons/secure-firebase-cloud-functions/