小编典典

具有自定义声明的Firebase存储规则

python

我无法使用自定义规则和自定义声明来使用Firebase Storage。

在我的Python管理员面板中,我执行以下操作来创建用户并分配声明client_id:

# Standard Auth
import firebase_admin
from firebase_admin import db, storage, auth
cred   = firebase_admin.credentials.Certificate('path_to_cert_json')
app    = firebase_admin.initialize_app(cred, 'config')
bucket = storage.bucket(app=app)

# Create User
auth.create_user(email=email)

# Create custom claims
auth.set_custom_user_claims(uid, {'client_id': client_id})

然后,对于Firebase规则,我尝试仅当文件位于具有client_id的子文件夹中时,才允许用户读取(或下载)文件:

存储中的文件结构:

/{environment}/{client_id}/other_folders_and_files

我设置了以下存储规则:

service firebase.storage {
  match /b/{bucket}/o {
    match /{environment}/{client_id}/{allPaths=**} {
      allow read: if request.auth.token.client_id == client_id
    }
  }
}

但这给我一个错误,即权限被拒绝。

我究竟做错了什么?

注意:

  • client_id是正确的并且文件夹结构是正确的,已对此进行了一百万次检查。

阅读 222

收藏
2021-01-20

共1个答案

小编典典

如果我没记错,那么您使用的是这个错误。应该:

service firebase.storage {
  match /b/{bucket}/o {
    match /{environment}/{client_id}/{allPaths=**} {
      allow read: if request.auth.uid == client_id
    }
  }
}

令牌返回其他对象,例如:

  • 电子邮件
  • email_verified
  • 电话号码
  • 名称

因此,为了能够比较您必须使用的用户ID
request.auth.uid。这种方式将比较cliente客户ID。如果您想看一下文档,那么一切都可以了request.auth

编辑

如果您想要自己的自定义令牌,例如:request.auth.token.client_id,则需要使用Python中的以下代码来完成:

uid = 'some-uid'
additional_claims = {
    'client_id': your_custom_client_id
}

custom_token = auth.create_custom_token(uid, additional_claims)

然后,您可以在存储规则中使用:

service firebase.storage {
  match /b/{bucket}/o {
    match /{environment}/{client_id}/{allPaths=**} {
      allow read: if request.auth.token.client_id == client_id
    }
  }
}

查看文档

2021-01-20