无法通过 HTTP/REST 访问 FireBase 数据库错误 403 Forbidden

Posted

技术标签:

【中文标题】无法通过 HTTP/REST 访问 FireBase 数据库错误 403 Forbidden【英文标题】:Can't access FireBase Database via HTTP/REST error 403 Forbidden 【发布时间】:2017-04-10 03:56:36 【问题描述】:

用于服务器的 Swift + Vapor 框架 + Xcode 8.1

我正在尝试读取向我的数据库发出 HTTP 请求的 Firebase 实时数据库,但我的权限被拒绝。

这些是步骤: 1. 使用从“console.developers.google.com”下载的密钥创建 JWT 签名 2. 向 OAuth2 服务器发送 POST 请求并获取访问令牌 3. 使用从 OAuth2 服务器接收到的访问令牌向 firebase 数据库发送 GET 请求。

我得到“权限被拒绝”,HTTP/1.1 403 Forbidden

// the header of the JSON Web Token (first part of the JWT)
let headerJWT = ["alg":"RS256","typ":"JWT"]

// the claim set of the JSON Web Token
let jwtClaimSet =
  ["iss":"firebase-adminsdk-kxx5h@fir-30c9e.iam.gserviceaccount.com",
 "scope":"https://www.googleapis.com/auth/firebase.database", //is this the correct API to access firebase database?
 "aud":"https://www.googleapis.com/oauth2/v4/token",
 "exp": expDate,
 "iat": iatDate]


drop.get("access")  request in
var accesstoken = "ya29.ElqhA-....XXXX"

 let responseFirebase = try drop.client.get("https://fir- 30c9e.firebaseio.com/data/Users.json",
  headers: ["Authorization":"Bearer \(accesstoken)"], 
     query: [:])

print("FirebaseResponse_is \(responseFirebase)")
return "success"

【问题讨论】:

@frank van puffelen 您能否就我为什么无法访问我的 Firebase 数据库发表您的看法? 【参考方案1】:

TLDR; 尝试将auth=<TOKEN> 放在查询字符串中,而不是使用授权标头。


Firebase 文档不清楚这是如何工作的。根据文档,应该有三种方法。

    查询字符串中的auth=<TOKEN> (link) 查询字符串中的access_token=<TOKEN> (link) 请求标头中的Authorization: Bearer <TOKEN> (link)

我不相信这三种方法都确实有效。我在我的应用程序中使用方法 1,所以我知道肯定可以。

【讨论】:

如果我这样做 headers: [:], query: ["auth":"ya29.E...XXXX"]) 我会收到 400 Bad Request。如果我这样做 headers: [:], query: ["access_token":"ya29.ElqiA"]) 我会得到 403 Forbidden。如果我这样做 headers: ["Authorization":"Bearer \(accesstoken)"], query: [:]) ,我会得到 403 Forbidden 我也试过curl https://fir-30c9e.firebaseio.com/data/Users.json?access_token=ya29.ElqiAz4TSV-FXkKpXOE636vk__pWx8y5pqZ5QYW.....and so on,但我得到“错误”:“权限被拒绝。” 那我不确定。如果 curl 甚至不起作用,也许您的令牌无效?如果您使用的是硬编码的访问令牌,它可能已过期。 scope 键缺少值 https://www.googleapis.com/auth/userinfo.email auth 也是对我有用的三种方法中唯一一种。来自 firebase 的非常混乱的文档。【参考方案2】:

scope 键缺少值 https://www.googleapis.com/auth/userinfo.email

 let jwtClaimSet =
   ["iss":"firebase-adminsdk-kxx5h@fir-30c9e.iam.gserviceaccount.com",
 "scope": "https://www.googleapis.com/auth/firebase.database  
 https://www.googleapis.com/auth/userinfo.email", 
 "aud":"https://www.googleapis.com/oauth2/v4/token",
 "exp": expDate,
 "iat": iatDate]

我找到了答案browsing google groups here

【讨论】:

【参考方案3】:
headers: ["Authorization":"Authorization: Bearer \(accesstoken)"],

应该是

headers: ["Authorization":"Bearer \(accesstoken)"],

【讨论】:

您可以尝试解开访问令牌吗? `headers: ["Authorization":"Bearer (accesstoken!)"],也打印出你的 headers 并发布它的样子 我无法强制打开 accesstoken,因为它不是可选的。 FirebaseResponse_is 响应- HTTP/1.1 403 Forbidden - Headers: Connection: keep-alive Cache-Control: no-cache Server: nginx Date: Fri, 25 Nov 2016 17:55:00 GMT Content-Type: application/json; charset=utf-8 Content-Length: 37 Strict-Transport-Security: max-age=31556926; includeSubDomains; preload Access-Control-Allow-Origin: * - Body: "error" : "Permission denied."

以上是关于无法通过 HTTP/REST 访问 FireBase 数据库错误 403 Forbidden的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UICollectionView 无法访问我在 for 循环中创建的数组 - 致命错误:索引超出范围

Azure Mysql HTTP REST API 。获取 JSON 网络令牌

正确上传不正确的 CSV 文件的 HTTP REST API 状态代码

使用 angular 2 的 http rest api

Http REST 调用问题 POST 上没有“Access-Control-Allow-Origin”

付费安卓应用的服务器端用户身份验证