Я использую Xcode 8.1 с Vapor и SWIFT 3.
Я отправляю запрос на сервер Google для получения токена аутентификации, поэтому я могу вызвать FireBaseDB API, но получаю сообщение об ошибке: unsupported_grant_type / Invalid grant_type.
На developers.google.com говорится, что мне нужно закодировать в URL-адресе следующее: https://www.googleapis.com/oauth2/v4/token + grant_type + assertion и передать закодированный URL-адрес в теле запроса POST. . Я передаю это как строку.
Я заметил, что закрытый ключ из файла JSON, загруженного из моей учетной записи службы, содержит такие символы, как / n, ----, ==, следует ли мне удалить их перед отправкой ключа?
let dateNow = Date()
var expDate = String(Int(dateNow.timeIntervalSince1970 + (60 * 60)))
var iatDate = String(Int(dateNow.timeIntervalSince1970))
let headerJWT = ["alg":"HS256","typ":"JWT"]
let jwtClaimSet =
["iss":"[email protected]",
"scope":"https://www.googleapis.com/auth/firebase.database",
"aud":"https://www.googleapis.com/oauth2/v4/token",
"exp": expDate,
"iat": iatDate]
//create and sign JSON Web Token
let jwt = try JWT(headers: Node(node: headerJWT),
payload: Node(node: jwtClaimSet),
signer: HS256(key:"-----BEGIN PRIVATE KEY-----\nMIIEvAWvQ== \n-----END PRIVATE KEY-----\n"))
// Store JSON Web Token
let JWTtoken = try jwt.createToken()
func createUrlWithString() -> NSURL {
var urlString = "https://www.googleapis.com/oauth2/v4/token"
urlString.append("?grant_type=")
urlString.append("urn:ietf:params:oauth:grant-type:jwt-bearer")
urlString.append("&assertion=")
urlString.append(JWTtoken)
return NSURL(string: urlString)!
}
// make the body input for our POST
let bodyURL = createUrlWithString().absoluteURL
drop.get("any") { request in
let response =
try drop.client.request(.other(method:"Post"),
"https://www.googleapis.com/oauth2/v4/token",
headers: ["Content-Type": "application/x-www-form-urlencoded"],
query: [:],
body: String(describing: bodyURL) )
let serverResp = response.headers
let serverBody = response.body.bytes
let serverJson = try JSON(bytes: serverBody!)
print(serverJson)
return "POST Request went through"
}
Обновлять
Согласно предложению Кароля Гасеницы, я передаю параметры grant_type
и assertion
в качестве параметров запроса POST. Теперь я получаю "error_description": Node.Node.string("SSL is required to perform this operation.")]))
func createUrlWithString() -> NSURL {
var urlString = "https://www.googleapis.com/oauth2/v4/token"
urlString.append("?grant_type=")
urlString.append("urn:ietf:params:oauth:grant-type:jwt-bearer")
urlString.append("&assertion=")
urlString.append(JWTtoken)
return NSURL(string: urlString)!
}
let response = try drop.client.request(.other(method:"Post"),
String(describing: bodyURL),
headers: ["Content-Type": "application/x-www-form-urlencoded"],
query: [:])
"alg":"RS256"
на"alg":"HS256"
, поскольку HS256 является только обязательным alg [0 ] tools.ietf.org/html/rfc7519#section-8 - person themihai   schedule 20.11.2016