Marco Swift + Vapor para servidor + Xcode 8.1
Intento leer Firebase Realtime Database haciendo solicitudes HTTP a mi base de datos, pero obtengo permiso denegado.
Estos son los pasos:
1. crear JWT, firmarlo con la clave secreta descargada de “console.developers.google.com”
2. envíe la solicitud POST al servidor OAuth2 y obtenga el token de acceso
3. Enviar solicitud GET a la base de datos de firebase con token de acceso recibido del servidor OAuth2.
Obtengo “Permiso denegado”, HTTP / 1.1 403 Prohibido
// 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" }
TLDR; Intente colocar auth=
en su cadena de consulta en lugar de usar el encabezado de autorización.
La documentación de Firebase no está clara de cómo funciona esto. De acuerdo con la documentación, existen tres métodos que deberían funcionar.
auth=
en la cadena de consulta ( enlace ) access_token=
en la cadena de consulta ( enlace ) Authorization: Bearer
en el encabezado de solicitud ( enlace ) Sin embargo, no estoy convencido de que los tres métodos realmente funcionen. Estoy usando el método 1 en mi aplicación, así que sé que uno funciona con seguridad.
La clave de scope
carecía de valor 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]
Encontré la respuesta para explorar grupos de google aquí
headers: ["Authorization":"Authorization: Bearer \(accesstoken)"],
debiera ser
headers: ["Authorization":"Bearer \(accesstoken)"],