【发布时间】:2016-11-19 17:46:14
【问题描述】:
我正在运行带有 Vapor 和 SWIFT 3 的 Xcode 8.1。
我正在向谷歌服务器发布请求以获取身份验证令牌,因此我可以调用 FireBaseDB API,但我收到错误:unsupported_grant_type/Invalid grant_type。
在developers.google.com 上,它说我必须在 URL 中编码以下内容:https://www.googleapis.com/oauth2/v4/token + grant_type + 断言,并在 POST 请求的正文中传递编码的 URL。我将它作为字符串传递。
我注意到从我的服务帐户下载的 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":"firebase-adminsdk-c7i48@fir-10c2e.iam.gserviceaccount.com",
"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"
}
更新
根据 Karol Gasienica 的建议,我将 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: [:])
【问题讨论】:
-
我对 swift 不熟悉,但我认为您的 alg 参数可能是错误的。您使用 SHA-256 散列(又名“RS256”)指定(RSASSA-PKCS1-v1_5),但您似乎使用 HMAC SHA-256(“HS256”)对 jwt 进行编码。我建议您将
"alg":"RS256"替换为"alg":"HS256"因为 HS256 只是强制 alg [0] tools.ietf.org/html/rfc7519#section-8