【问题标题】:Firebase server side auth with HTTP POST request using the firebase secretFirebase 服务器端身份验证与 HTTP POST 请求使用 firebase 秘密
【发布时间】:2014-04-06 22:52:43
【问题描述】:

根据 firebase 文档,Firebase 接受所有 REST API 类型进行身份验证。

REST API - Firebase authentication 换句话说,PUT/POST/GET 请求都可以在 HTTP 请求中用于验证授权。这是示例代码:

curl \
https://SampleChat.firebaseIO-demo.com/users/jack/name.json?auth=CREDENTIAL

Firebase 文档还指出:

参数可以是您的 Firebase Secret 或身份验证 令牌

我发送的 POST 请求是这样配置的:

var Credential = "{\"auth:\", \"zXRLa7lybhJ21ZYqpXuqkT6YAYyySAGJ10lXInKy\"}";

https://MyFirebaseName.firebaseio.com/.json?auth="+Credential

所以,我想使用 POST 请求和我的 Firebase Secret 进行服务器身份验证。我的安全规则是:

{
    "rules": {
        ".read": true,
        ".write": "auth == 'zXRLa7lybhJ21ZYqpXuqkT6YAYyySAGJ10lXInKy'"
    }
}

我收到从 firebase 返回的错误消息:

无效参数: "https://MyFirebaseName.firebaseio.com/.json?auth="zXRLa7lybhJ21ZYqpXuqkT6YAYyySAGJ10lXInKy"

看起来POST 请求实际上正在通过 Firebase,而 Firebase 正在读取数据。只是参数配置不正确。我已经尝试了我能想到的一切。我不确定应该如何配置CREDENTIALS,我也找不到任何关于它的信息。也许应该是这样的:

{"auth": "The Secret Here"} 

我刚试过,它不接受。

我也尝试过使用:

{
    "rules": {
        ".read": true,
        ".write": "auth !== null"
    }
}

希望无论我在 REST API 中发送什么都会被接受,但这没有用。

我做错了什么?我已经多次查看文档,在这里搜索,搜索了一个谷歌组。我想不通。我需要知道 POST 数据如何在 CREDENTIALS 中发送的格式和语法。

【问题讨论】:

  • 您是否真的在尝试针对<something>.fireabseio-demo.com 进行身份验证?您将在此处获得结果,但演示服务器没有身份验证或安全规则。 auth !== null 应该适用于任何有效的令牌。你是如何创建你的,或者你是否使用了该命名空间的秘密?
  • 这不是演示,不是。我没有使用令牌,我只想使用Firebase Secret。我并不反对使用令牌,但我的印象是我可以只使用秘密进行服务器身份验证,而不是个人用户身份验证。至于 REST API 服务器身份验证的文档,我能找到的只是我在帖子顶部显示的一行示例 curl 等。它给出的只是?auth=CREDENTIAL。而已。我用什么代替CREDENTIAL
  • 您可以在 Forge 中的安全密钥中查看,单击显示,然后将该值放在您看到 CREDENTIAL 的位置。
  • 是的,我试过了。我去了Secrets标签,点击Show并复制了我的Firebase Secret。我把它作为字符串放在 URL 的末尾; ?auth="+Credential 其中CredentialFirebase Secret

标签: authentication firebase


【解决方案1】:

URL 无法解析 json。它只是一串文本。只需直接包含令牌即可。

curl -X https://INSTANCE.firebaseio.com/users/jack.json?auth=zXRLa7lybhJ21ZYqpXuqkT6YAYyySAGJ10lXInKy  // not { auth: '...' }

当您在 URL 中使用 Firebase 机密时,不会应用安全规则。该密钥允许您完全读/写访问权限,而无需考虑安全规则或验证。因此,无需将任何内容读入您的安全规则。

使用令牌时,您不参考安全令牌本身。那是一个加密的 json 对象,contents 是安全规则中可用的。

要了解这里发生的事情,您需要对令牌有一个基本的了解。至少,这需要从上到下阅读security quickstart,以及从上到下阅读有关auth variable 的部分。

在 auth 变量部分,你会发现这个例子:

var token = tokenGenerator.createToken({"app_user_id": 1234, "isModerator": true });

注意令牌的内容是app_user_idisModerator。您现在可以在安全规则中引用这两个变量:

".read": "auth.isModerator === true"

您还可以通过fiddling with them here 加深对代币的理解;允许您创建和分解令牌以查看其中的内容,并根据您的命名空间验证它们以确保它们正常工作。

【讨论】:

    【解决方案2】:

    您的规则只需要将 write 设置为 false,如下所示:

    {
        "rules": {
            ".read": true,
            ".write": false
        }
    }
    

    无论规则如何,您的 curl 请求中的“?auth=yourFireBaseSecret”都将允许您的 REST 调用通过。任何其他请求都需要尊重它,并且无法写入您的数据。

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      相关资源
      最近更新 更多