- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Vapor 和 SWIFT 3 运行 Xcode 8.1。
我正在向谷歌服务器发送请求以获取授权 token ,这样我就可以调用 FireBaseDB API,但出现错误:unsupported_grant_type/Invalid grant_type。
在 developers.google.com它说我必须在 URL 中编码以下内容:https://www.googleapis.com/oauth2/v4/token + grant_type + assertion,并在 POST 请求的正文中传递编码后的 URL。我将它作为字符串传递。
我注意到从我的服务帐户下载的 JSON 文件中的私钥包含/n 、 ----、== 等字符,我应该在发布 key 之前删除它们吗?
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: [:])
最佳答案
当您生成服务帐户凭据时,您需要牢记以下内容 ,取自 https://cloud.google.com/storage/docs/authentication
:您可以通过为服务帐号创建 OAuth 客户端 ID,在 Cloud Platform Console 中创建私钥。您可以获得 JSON 和 PKCS12 格式的私钥:
如果您使用 Application Default Credentials,则需要 JSON key 在 Google Cloud Platform 之外的生产环境中。 JSON key 无法转换为其他格式。许多不同的编程语言和库都支持 PKCS12 (.p12)。如果需要,您可以使用 OpenSSL ( see Converting the private key to other formats ) 将 key 转换为其他格式。但是,PKCS12 key 无法转换为 JSON 格式。
cat/path/to/xxxx-privatekey.p12 | openssl pkcs12 -nodes -nocerts -passin pass:notasecret | openssl rsa >/path/to/secret.pem
去github搜索VaporJWT并将其导入 Xcode。它将帮助您创建一个签名的 JSON Web Token。
在此 github 页面上,您将了解如何提取私钥以供 RSA 使用。
//将 .pem 转换为 deropenssl rsa -in/path/to/secret.pem -outform der -out/path/to/private.der
//将.der转换为.base64openssl base64 -in/path/to/private.der -out/path/to/Desktop/private.txt
在 private.txt 中,您拥有以 base64 编码的私钥,您最终可以使用它来签署 JWT。然后您可以使用签名的 JWT 调用 Google API。
import Vapor
import VaporJWT
let drop = Droplet()
var tokenID:String!
//set current date
let dateNow = Date()
// assign to expDate the validity period of the token returnd by OAuth server (3600 seconds)
var expDate = String(Int(dateNow.timeIntervalSince1970 + (60 * 60)))
// assign to iatDate the time when the call was made to request an access token
var iatDate = String(Int(dateNow.timeIntervalSince1970))
// 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-c7i38@fir-30c9e.iam.gserviceaccount.com",
"scope":"https://www.googleapis.com/auth/firebase.database",
"aud":"https://www.googleapis.com/oauth2/v4/token",
"exp": expDate,
"iat": iatDate]
//Using VaporJWT construct a JSON Web Token and sign it with RS256 algorithm
//The only signing algorithm supported by the Google OAuth 2.0 Authorization Server is RSA using SHA-256 hashing algorithm.
let jwt = try JWT(headers: Node(node: headerJWT), payload: Node(node:jwtClaimSet), encoding: Base64URLEncoding(), signer: RS256(encodedKey: "copy paste here what you have in private.txt as explained at point 7 above "))
// create the JSON Web Token
let JWTtoken = try jwt.createToken()
let grant_type = "urn:ietf:params:oauth:grant-type:jwt-bearer" // this value must not be changed
let unreserved = "*-._"
let allowed = NSMutableCharacterSet.alphanumeric()
allowed.addCharacters(in: unreserved)
// percent or URL encode grant_type
let grant_URLEncoded = grant_type.addingPercentEncoding(withAllowedCharacters: allowed as CharacterSet)
// create a string made of grant_type and assertion. NOTE!!! only grant_type's value is URL encoded.
//JSON Web Token value does not need to be URL encoded
var fullString = "grant_type=\(grant_URLEncoded!)&assertion=\(JWTtoken)"
//pass fullString in the body parameter
drop.get("call") { request in
let response = try drop.client.post("https://www.googleapis.com/oauth2/v4/token", headers: ["Content-Type": "application/x-www-form-urlencoded"], query: [:],body: fullString)
let serverResp = response.headers
let serverBody = response.body.bytes
let serverJson = try JSON(bytes: serverBody!)
print(serverJson)
return "Success"
}
关于Swift Vapor unsupported_grant_type 无效的签名/OAuth 访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40696026/
我们使用 Web 服务器身份验证流程实现了 OAuth 2.0。十月/十一月时运行良好,但突然停止运行。每当我们尝试授权另一个客户端时,服务器都会返回 (400) Bad Request with t
我正在尝试使用 django 发送请求,以使用 OAuth2 从我的 api 获取 access_token。我正在执行此代码: data = {'username': 'admin', 'passw
我有以下问题: 我正在创建一个 API(我是新来的) 有了这个 API,我想使用另一个 API 或 WebService 在 Postman 中,我向 URL 发出了一个 get 请求,它返回 OK
我正在尝试使用 alamofire 登录。我正在使用以下代码: let parameters = [ "username": "2gggggjggg",
我一直在尝试获取最简单的 IdentityServer4 示例,以便在后面的纯代码中请求访问。我可以在使用客户端请求时获得访问 token ,但在进行用户登录时却不能。 var discos = ne
我正在尝试让 discord OAuth 正常工作。在文档中,需要生成一个代码,这一步效果很好,但之后是生成 token 。它要求使用正确的参数发出 POST 请求,但它总是给我带来错误:{"erro
我正在玩 laravel 并尝试启用客户端凭据授予以保护某些 api 端点。 提供一些上下文: 我想创建一个位于数据库和多个网站(和 SPA)之间的 api。因此,我将能够进行一些监控(哪些网站/SP
问题 当我尝试验证从 Apple SSO 客户端流程返回的 code 时,我不断收到 unsupported_grant_type 400 错误。 docs假设当经过身份验证的客户端无权使用授权类型时
我正在尝试从 Pay Pal REST API 获取访问 token ,遵循这篇文章:https://developer.paypal.com/docs/api/overview/#get-an-ac
我正在尝试按照 docs 获取 Sage One API 的访问 token 使用 Guzzle (v6)/Laravel 5.2(Laravel 的参与与本题无关),卡在“请求访问 token ”阶
您好,我尝试做一个 Web 应用程序,但遇到了问题。当我从/oauth/token 请求 token 时,我收到此响应: {"error":"unsupported_grant_type","mess
我正在创建一个访问 Azure 上托管的数据库的 WebApi。实现基于 token 的身份验证后,它在本地完美运行,但在 Azure 上发布后,当我尝试获取访问 token 时,在 Postman
我正在创建一个访问 Azure 上托管的数据库的 WebApi。实现基于 token 的身份验证后,它在本地完美运行,但在 Azure 上发布后,当我尝试获取访问 token 时,在 Postman
我正在使用 Vapor 和 SWIFT 3 运行 Xcode 8.1。 我正在向谷歌服务器发送请求以获取授权 token ,这样我就可以调用 FireBaseDB API,但出现错误:unsuppor
我正在尝试使用 Node.js 应用程序访问 Spotify Web API。我已将 grant_type 指定为 authorization_code,但收到 unsupported_grant_t
我正在使用概述的“ token 检索(代码流)”here通过 OAuth2 检索 Reddit Api 的访问 token 。我已设法获得“code”字符串,但在尝试检索访问 token 时出现 un
我正在尝试将 paypal 集成到我的应用程序中,但出现 400 错误 [unsupported_grant_type] 授予类型为 NULL axios .post( '
我是 Salesforce 开发的新手,正在尝试连接到 Salesforce 来获取 token 。 我想我的问题有两个:1) 是否必须通过网页进行SF认证? 2)如果没有,为什么这不起作用?当我尝试
我已经使用 Passport 2.0 和 Laravel 5.4 成功实现了授权码授予和密码授予。添加 Passport::enableImplicitGrant(); 后在 AuthServiceP
我找遍了SO都无济于事,仍然没有解决方案。我正在尝试使用 asp.net 控制台应用程序和 httpclient 从第三方服务获取身份验证 token 。在 Postman 中一切正常,但在 C# 中
我是一名优秀的程序员,十分优秀!