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"
}
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
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.
auth=<TOKEN>
dans la chaîne de requête ( link )access_token=<TOKEN>
dans la chaîne de requête ( link )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.
headers: ["Authorization":"Authorization: Bearer \(accesstoken)"],
devrait être
headers: ["Authorization":"Bearer \(accesstoken)"],