web-dev-qa-db-fra.com

Impossible d'accéder à la base de données FireBase via l'erreur HTTP/REST 403 interdite

Cadre Swift + Vapor pour serveur + Xcode 8.1

J'essaie de lire la base de données Firebase Realtime en faisant des requêtes HTTP vers ma base de données, mais l'autorisation est refusée. 

Ce sont les étapes:
1. créer JWT le signer avec la clé secrète téléchargée à partir de "console.developers.google.com"
2. envoyer la demande POST au serveur OAuth2 et obtenir un jeton d'accès
3. envoie la requête GET à la base de données firebase avec le jeton d'accès reçu du serveur OAuth2. 

J'obtiens "Autorisation refusée", HTTP/1.1 403 Interdit

// 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":"[email protected]",
 "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 Service Account  FireBase Database Rulles

12
bibscy

La clé scope manquait valeur https://www.googleapis.com/auth/userinfo.email 

 let jwtClaimSet =
   ["iss":"[email protected]",
 "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]

J'ai trouvé la réponse en parcourant les groupes Google ici

4
bibscy

TLDR; Essayez de placer auth=<TOKEN> dans votre chaîne de requête au lieu d'utiliser l'en-tête d'autorisation.


La documentation de Firebase n’explique pas comment cela fonctionne. Selon la documentation, il y a trois méthodes qui devraient fonctionner.

  1. auth=<TOKEN> dans la chaîne de requête ( link )
  2. access_token=<TOKEN> dans la chaîne de requête ( link )
  3. Authorization: Bearer <TOKEN> dans l'en-tête de la demande ( link )

Cependant, je ne suis pas convaincu que les trois méthodes fonctionnent réellement. J'utilise la méthode 1 dans mon application, alors je sais que cela fonctionne à coup sûr.

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

devrait être

headers: ["Authorization":"Bearer \(accesstoken)"],
0
Nikola.Lukovic