无法通过 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 状态代码