15

Swift + Vapor 服务器框架 + Xcode 8.1

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

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

我得到“权限被拒绝”,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"
}

Firebase 服务帐号 FireBase 数据库规则

4

3 回答 3

7

TLDR;尝试放入auth=<TOKEN>您的查询字符串而不是使用授权标头。


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

  1. auth=<TOKEN>在查询字符串(链接
  2. access_token=<TOKEN>在查询字符串(链接
  3. Authorization: Bearer <TOKEN>在请求头(链接

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

于 2016-11-26T19:30:01.287 回答
6

关键是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]

我在这里找到了浏览谷歌群组的答案

于 2016-11-27T17:06:21.900 回答
0
headers: ["Authorization":"Authorization: Bearer \(accesstoken)"],

应该

headers: ["Authorization":"Bearer \(accesstoken)"],
于 2016-11-25T17:50:04.367 回答