自定义标记的查询权限

问题描述 投票:0回答:1

我有一个包含的appid的有效载荷,以确定第三方应用程序的自定义标记。

我想验证读取/写入我的数据是这样的:

  1. 用户已登录(有一个有效的UID /令牌)
  2. 该APPID注册的/apps集合
  3. UID和APPID都在记录中的字段和匹配证书
  4. (无关的这个问题,但要完成)此记录文档的模式相匹配。

current best solution and remaining questions

这个答案,我最终偶然发现,是相当不错的,但也可能得到改善。

我所要做的就是正确识别我给自定义标记的有效载荷的第一件事情 - 因为我在使用云服务功能,生成有效载荷(graphcool),我的有效载荷是default: { appid },而不是仅仅appid。从那里,只是在一些权限重新措辞已经足够使用我会想象当前规则succeessdully验证:

service cloud.firestore {
  match /databases/{database}/documents {

    match /sampleData/{type}/{appName}/{record} {
      allow read: if isSignedIn() && isValidApp(database) && ownsExisting() && appIdInExisting()
      allow write: if isSignedIn() && isValidApp(database) && ownsPayload() && appIdInPayload()
    }

    // functions
    function isSignedIn () {
        return request.auth != null
    }

    function isValidApp (database) {
        return exists(/databases/$(database)/documents/apps/$(request.auth.token.appid))
    }

    function ownsExisting () {
        return resource.data.uid == request.auth.uid
    }

    function ownsPayload () {
        return request.resource.data.uid == request.auth.uid
    }

    function appIdInExisting () {
        return resource.data.app_id == request.auth.token.appid
    }

    function appIdInPayload () {
        return request.resource.data.app_id == request.auth.token.appid
    }
  }
}

有人可能会做的更好,虽然。

  1. 是否有任何方式来验证的appid,而不使用存在请求(而无需编写的if-else如果链) - 直接在也许是规则的阵列状?
  2. 我怎么能保证在有效载荷指定的appid相匹配的,当我发出的服务凭证到客户端第三方应用程序,我设想?

edit: original question

我以为我可以得到至少前两个自己:

service cloud.firestore {
  match /databases/{database}/documents {

    match /sampleData {
      allow read: if isSignedIn() && isValidApp() && ownsExisting() && appIdInExisting()
      allow write: if isSignedIn() && isValidApp() && ownsPayload() && appIdInPayload()
    }

    // functions
    function isSignedIn () {
        return request.auth != null
    }

    function isValidApp () {
        return get(path('apps')).data.child(request.auth.token.appid).exists()
    }

    function ownsExisting () {
        return resource.data.uid == request.auth.uid
    }

    function ownsPayload () {
        return request.resource.data.uid == request.auth.uid
    }

    function appIdInExisting () {
        return resource.data.app_id == request.auth.token.appid
    }

    function appIdInPayload () {
        return request.resource.data.app_id == request.auth.token.appid
    }
  }
}

/apps呼吁1号文件“样本的应用ID”与“样品APP-ID” ID和name字段......但在我的令牌使用这不起作用:FirebaseError: Missing or insufficient permissions

我通过我的服务器上这个功能生成令牌:

var FirebaseAdmin = require('firebase-admin')
var serviceAccount = require('./firebase-service-credentials.json')
var claims = require('./custom-token-claims') // {appid: 'sample-app-id'}

let credential = FirebaseAdmin.credential.cert(serviceAccount)
FirebaseAdmin.initializeApp({ credential })

const generateTokenWithPayload = async id => {
  try {
    const token = await FirebaseAdmin.auth().createCustomToken(id, claims)

    return { data: { token } }
  } catch (err) {
    return { error }
  }
}

module.exports = async event =>
  await generateTokenWithPayload(event.data.userIdentifier)

并在发布前,我在签约 - 这部分我可以验证似乎是工作,因为我看到我验证了新的非匿名用户 - >用户选项卡中的火力控制台:

— Feb 11, 2019 Feb 11, 2019 smaple-user-id

这本质上是客户端代码:

await firebase
      .auth()
      .signInWithCustomToken(token)
      .catch(console.error)
const db = await firebase.firestore()
db.collection(path + this.state.appName).add(payload) 

我张贴与架构{app_id, app_name, date, metric, uid}到的sampleData记录/度/样本应用程序名称/ {自动生成}

笔记:

  • 那些将要注册的应用程序的数量少 - 它可能会从财务角度看,应使这只是在许可文件中的静态数组,如果这是可能的,而不是一个GET请求。
  • 巨大的进步 - 我只注意到request.auth.token.appid因为我用request.auth.token.default.appidexport defaultinstead应modules.export
firebase firebase-authentication google-cloud-firestore firebase-security-rules
1个回答
0
投票

这个答案是相当不错的,但也可能得到改善。

我所要做的就是正确识别我给自定义标记的有效载荷的第一件事情 - 因为我在使用云服务功能,生成有效载荷(graphcool),我的有效载荷是default: { appid },而不是仅仅appid。从那里,只是在一些权限重新措辞已经足够使用我会想象当前规则succeessdully验证:

service cloud.firestore {
  match /databases/{database}/documents {

    match /sampleData/{type}/{appName}/{record} {
      allow read: if isSignedIn() && isValidApp(database) && ownsExisting() && appIdInExisting()
      allow write: if isSignedIn() && isValidApp(database) && ownsPayload() && appIdInPayload()
    }

    // functions
    function isSignedIn () {
        return request.auth != null
    }

    function isValidApp (database) {
        return exists(/databases/$(database)/documents/apps/$(request.auth.token.appid))
    }

    function ownsExisting () {
        return resource.data.uid == request.auth.uid
    }

    function ownsPayload () {
        return request.resource.data.uid == request.auth.uid
    }

    function appIdInExisting () {
        return resource.data.app_id == request.auth.token.appid
    }

    function appIdInPayload () {
        return request.resource.data.app_id == request.auth.token.appid
    }
  }
}

有人可能会做的更好,虽然。

  1. 是否有任何方式来验证的appid,而不使用存在请求(而无需编写的if-else如果链) - 直接在也许是规则的阵列状?
  2. 我怎么能保证在有效载荷指定的appid相匹配的,当我发出的服务凭证到客户端第三方应用程序,我设想?
© www.soinside.com 2019 - 2024. All rights reserved.