是否可以集成外部权限服务器?

时间:2019-03-12 12:21:05

标签: firebase google-cloud-firestore firebase-security-rules

我已经与Ory Keto一起实施了RBAC,以根据令牌的声明来管理用户的权限。我使用Ory Oathkeeper作为反向代理,该代理使用Ory Hydra对用户进行身份验证,并使用Ory Keto对用户进行授权。现在,我想将这些服务与Firebase / Firestore集成。

我认为可以将Ory Hydra(身份验证服务器)与Firebase / Firestore集成,因为可以集成Auth0(https://auth0.com/blog/developing-real-time-apps-with-firebase-and-firestore/)。也就是说,我认为可以使用Hydra的访问令牌(OAuth2)或OpenId令牌(JWT)创建自定义的Firebase令牌,然后使用后者来授权访问(创建Firebase规则)。

我想知道是否可以在Firebase授权过程中使用Ory Keto的角色。换句话说,如果有可能将外部权限服务器集成到firebase中以授予访问权限。

1 个答案:

答案 0 :(得分:1)

无法从Firestore的安全规则中调出第三方授权服务器,因为这样做的性能无法预测。

您可以做的是在Firestore安全规则内提供来自第三方授权服务器的信息。有两种常见方法:

  1. 在用户的身份验证配置文件中将这些信息作为自定义声明提供。
  2. 在Firestore自身内部提供信息。

这两项任务中的任何一项都必须从受信任的代码执行,因此必须在受信任的环境中运行,例如开发计算机,您控制的服务器或Cloud Functions。

如果信息很小且不太可能经常更改,则通常会将其放入自定义声明中(因为自定义声明可能需要一些时间才能传播)。例如:用户是否是管理员通常是一次性更改,非常适合自定义声明。然后,您可以使用以下内容访问安全规则内的自定义声明:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.token.admin == true;  
    } 
  }
}

如果授权信息更大或更不稳定,则通常将其存储在数据库中。然后,您可以按照以下安全规则访问它:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if exists(/databases/$(database)/documents/AuthorizedUsers/$(request.auth.id))
    } 
  }
}