使用FirebaseAuth,我可以在没有登录用户的情况下生成ID令牌吗?

时间:2018-03-14 21:02:44

标签: firebase-authentication google-cloud-functions angularfire2 firebase-admin bearer-token

我正在尝试使用此处的代码示例自定义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路由。这些路由只能在内部访问,发送请求的客户端。希望这能让人感觉到,我会听到更好的方法。

0 个答案:

没有答案