我正在尝试使用此处的代码示例自定义Firebase功能服务器:https://github.com/firebase/functions-samples/tree/master/authorized-https-endpoint。在我的Angular客户端中,我通过手动登录“后台”超级用户成功获得了新的idToken:
constructor(private firebaseAuth: AngularFireAuth) {}
...
this.firebaseAuth.auth
.signInAndRetrieveDataWithEmailAndPassword(
environment.firebaseSuperUser,
environment.firebaseSuperUserPass
)
.then((credential: UserCredential) => {
credential.user.getIdToken().then(token => {
this.storeTokenInDb(token)
this.callApi(token)
})
})
这是必需的,因为我服务器上的Auth中间件基于此令牌值限制对所有功能的访问:
admin
.auth()
.verifyIdToken(idToken)
.then(decodedIdToken => {
if (decodedIdToken.uid === 'D1akN6puCwYbkUMJAExTqOEx5fg4') {
console.log('Token matches admin user')
return next()
} else {
console.error('Failed to match token with admin user.')
return next('403 Unauthorized')
}
})
但是,这对我来说是一个长期存在问题的方法,因为每次我想刷新他的令牌时我都不想登录和注销我的超级用户。所以我的问题是,是否可以为用户获取ID令牌而无需将用户登录到?
我希望有这样的函数:FirebaseAuth.getIdToken({uid: 'D1akN6puCwYbkUMJAExTqOEx5fg4'})
返回与任何用户相对应的ID令牌,无论他们是否已登录。我想随时为任何用户生成Firebase ID令牌。
我想要这个的原因是因为我的客户端正在向我的Functions服务器发送HTTP GET请求作为“超级用户”,可以完全访问我的api/endpoints
(通过Bearer令牌授权)并对DB进行写访问:
{
"rules": {
".read": false,
".write": "auth.uid === 'D1akN6puCwYbkUMJAExTqOEx5fg4'"
}
}
也许我以错误的方式接近这个,但是现在我有一个普通的登录用户,第二个超级用户解雇了我所有的API请求。最重要的是,我想限制访问超级用户的api/endpoint
路由。这些路由只能在内部访问,发送请求的客户端。希望这能让人感觉到,我会听到更好的方法。