使用 OAuth2 服务帐户生成访问令牌时出现问题



我们在使用 OAuth2 服务帐户为 Google Apps 市场用户生成访问令牌时遇到问题。此处生成的令牌将用于访问Google API(联系人,日历,邮件,管理员SDK API),因此我们服务中的所有Google集成都失败了。这从太平洋标准时间 3 月 9 日上午 8 点开始突然失败。您能否将此视为高优先级,并让我们知道问题的原因,或者我们是否在这里遗漏了某些内容。我们得到的 API 响应为

{ "error": "invalid_request" }

请找到以下示例请求,其中包含"https://www.googleapis.com/oauth2/v4/token"(如文档中)和"https://accounts.google.com/o/oauth2/token"端点的 2 个示例请求的所有标头和参数。两者都会导致错误消息,分别包含响应 { "error": "internal_failure"、"error_description": "无效值"} 和 { "error": "invalid_request" }。

PS:如果我们使用各自的Google客户端库,则示例请求中用于生成以下签名的服务电子邮件地址,私钥文件有效。但我们正在利用谷歌的REST API。我们在 Google API 控制台中创建了一个示例应用程序,用于使用新的服务帐号详细信息进行测试,这会导致相同的异常。

网址:

https://www.googleapis.com/oauth2/v4/token

头:

内容类型:application/x-www-form-urlencoded

身体:

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9vYXV0aDIvdjQvdG9rZW4iLCJzdWIi OiJqYWdzQHNvbHV0aW9udGVzdC5jb20iLCJzY29wZSI6Imh0dHBzOi8vbWFpbC5nb29nbGUuY29t LyIsImlzcyI6IjQ2OTU3MTY1OTAxNUBkZXZlbG9wZXIuZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV4 cCI6MTQ1NzU5NTkwMCwiaWF0IjoxNDU3NTkyMzAwfQ==.VrsqS0nYSUVZn_SwMi7UJEYLDqRcWLzPrF9o6av-t1IYZbRkTybEdcnwWeUfnYXl_F88gFTllmRg LSTBahM5gqpZrEAaWrRiDEVTo6rcN3hWm7MHcmZbwgdJB8B0ObV0Ivp5aTdLC5HcqsOumJvYpDCF SyGU8StSg9pDujERzOo=

响应:

编号:400 { "错误": "internal_failure", "error_description": "无效值" }

网址:

https://accounts.google.com/o/oauth2/token

头:

内容类型:application/x-www-form-urlencoded

身体:

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9vYXV0aDIvdjQvdG9rZW4iLCJzdWIi OiJqYWdzQHNvbHV0aW9udGVzdC5jb20iLCJzY29wZSI6Imh0dHBzOi8vbWFpbC5nb29nbGUuY29t LyIsImlzcyI6IjQ2OTU3MTY1OTAxNUBkZXZlbG9wZXIuZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV4 cCI6MTQ1NzU5NTkwMCwiaWF0IjoxNDU3NTkyMzAwfQ==.VrsqS0nYSUVZn_SwMi7UJEYLDqRcWLzPrF9o6av-t1IYZbRkTybEdcnwWeUfnYXl_F88gFTllmRg LSTBahM5gqpZrEAaWrRiDEVTo6rcN3hWm7MHcmZbwgdJB8B0ObV0Ivp5aTdLC5HcqsOumJvYpDCF SyGU8StSg9pDujERzOo=

响应:

编号:400 { "错误":"invalid_request" }

编辑:文档中的示例请求。这段代码在过去的 2 年里一直在为我们工作,但昨天突然停止工作。

POST/oauth2/v4/token HTTP/1.1主持人:www.googleapis.com内容类型:application/x-www-form-urlencode

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2 dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS-6uQV6fGorGKrHf3LIJnyREw9evE-gs2bmMaQI5_UbabvI4k-mQE4kBqtmSpTzxYBL1TCd7Kv5nTZoUC1CmwmWCFqT9RE6D7XSgPUh_jF1qskLa2w0rxMSjwruNKbysgRNctZPln7cqQ

在我的代码中更改 sun.misc.BASE64Encoder 编码部分以生成 jwt 令牌后,它起作用了。

byte[] encode = BASE64Encoder.encode(data).replaceAll("n", "").getBytes();

(或)

将生成 jwt 令牌时将 BASE64Encoder 编码部分从 sun.misc.BASE64Encoder 更改为 org.apache.commons.codec.binary.Base64 作为

Base64 encoder = new Base64();
byte[] encode = encoder.encodeBase64(data);

如果您有人需要任何澄清,请添加评论。

此解决方案由谷歌提供。

相关内容

  • 没有找到相关文章

最新更新