使用 OAuth2 服务帐户生成访问令牌时出现问题
Posted
技术标签:
【中文标题】使用 OAuth2 服务帐户生成访问令牌时出现问题【英文标题】:Issue while generating access token using OAuth2 Service Accounts 【发布时间】:2016-06-25 08:20:47 【问题描述】:我们在为 Google Apps 市场用户使用 OAuth2 Service Account 生成访问令牌时遇到问题。此处生成的令牌将用于访问 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": "Invalid Value" 和 "error": "invalid_request" 。
P.S:如果我们使用相应的 Google 客户端库,则用于在示例请求中生成以下签名的服务电子邮件地址、私钥文件有效。但我们正在使用 Google 的 REST API。我们在 Google API 控制台中创建了一个示例应用程序,用于使用新的服务帐户详细信息进行测试,这会导致相同的异常。
网址:
https://www.googleapis.com/oauth2/v4/token
标题:
Content-Type:application/x-www-form-urlencoded
身体:
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbjzS9vYXRZViv4a OiJqYWdzQHNvbHV0aW9udGVzdC5jb20iLCJzY29wZSI6Imh0dHBzOi8vbWFpbC5nb29nbGUuY29t LyIsImlzcyI6IjQ2OTU3MTY1OTAxNUBkZXZlbG9wZXIuZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV4 cCI6MTQ1NzU5NTkwMCwiaWF0IjoxNDU3NTkyMzAwfQ==.VrsqS0nYSUVZn_SwMi7UJEYLDqRcWLzPrF9o6av-t1IYZbRkTybEdcnwWeUfnYXl_F88gFTllmRg LSTBahM5gqpZrEAaWrRiDEVTo6rcN3hWm7MHcmZbwgdJB8B0ObV0Ivp5aTdLC5HcqsOumJvYpDCF SyGU8StSg9pDujERzOo=
回复:
代码:400 “错误”:“内部故障”, “error_description”:“无效值”
网址:
https://accounts.google.com/o/oauth2/token
标题:
Content-Type:application/x-www-form-urlencoded
身体:
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbjzS9vYXRZViv4a OiJqYWdzQHNvbHV0aW9udGVzdC5jb20iLCJzY29wZSI6Imh0dHBzOi8vbWFpbC5nb29nbGUuY29t LyIsImlzcyI6IjQ2OTU3MTY1OTAxNUBkZXZlbG9wZXIuZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV4 cCI6MTQ1NzU5NTkwMCwiaWF0IjoxNDU3NTkyMzAwfQ==.VrsqS0nYSUVZn_SwMi7UJEYLDqRcWLzPrF9o6av-t1IYZbRkTybEdcnwWeUfnYXl_F88gFTllmRg LSTBahM5gqpZrEAaWrRiDEVTo6rcN3hWm7MHcmZbwgdJB8B0ObV0Ivp5aTdLC5HcqsOumJvYpDCF SyGU8StSg9pDujERzOo=
回复:
代码:400 “错误”:“无效请求”
编辑:documentation 中的示例请求。这段代码在过去 2 年里一直为我们工作,但昨天突然停止工作。
POST /oauth2/v4/token HTTP/1.1 主机:www.googleapis.com 内容类型:application/x-www-form-urlencoded
grant_type =瓮%3Aietf%3Aparams%3Aoauth%3Agrant型%3Ajwt承载&断言= eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS-6uQV6fGorGKrHf3LIJnyREw9evE-gs2bmMaQI5_UbabvI4k-mQE4kBqtmSpTzxYBL1TCd7Kv5nTZoUC1CmwmWCFqT9RE6D7XSgPUh_jF1qskLa2w0rxMSjwruNKbysgRNctZPln7cqQ P>
【问题讨论】:
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。请参阅:如何创建最小、完整和可验证的示例。 @DalmTo 我的问题清楚地表明我们在从developers.google.com/identity/protocols/… 提供的文档链接生成访问令牌时遇到问题,但我们看到错误消息为““error”:“invalid_request” " 创建一个失败的小代码示例并将其发布,以便我们帮助您调试它。没有看到您的代码,没有人可以帮助您修复它。 我们在 3 月 9 日突然开始遇到同样的问题!谷歌的人可以分享一下这个吗?? @Andreas Google 已确认他们方面存在一些问题。将在此处更新状态 【参考方案1】:在我的代码中更改 sun.misc.BASE64Encoder 编码部分以生成 jwt 令牌后,它起作用了。
byte[] encode = BASE64Encoder.encode(data).replaceAll("\n", "").getBytes();
(或)
在将 jwt 令牌从 sun.misc.BASE64Encoder 生成为 org.apache.commons.codec.binary.Base64 时更改您的 BASE64Encoder 编码部分
Base64 encoder = new Base64();
byte[] encode = encoder.encodeBase64(data);
如果您需要任何说明,请添加 cmets。
此解决方案由 Google 提供。
【讨论】:
以上是关于使用 OAuth2 服务帐户生成访问令牌时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 OAuth2 为 AdWords 帐户生成刷新令牌