我已经仔细查看了 Steve Bazyl 在https://www.youtube.com/watch?v=iK14bfd6qhs上的演示文稿以及 google 上的相关 API 文档。我正在为我的 gmail 帐户使用服务帐户电子邮件 ID,并且正在使用从控制台下载的私钥。
但是当我以史蒂夫在他的演示文稿中展示的那个客户端为模型运行测试客户端时,我一直得到
Signet::AuthorizationError:
Authorization failed. Server message:
{
"error" : "invalid_grant"
}
如果我将垃圾信添加到传递给 JWTAsserter 的电子邮件或范围,我会收到相同的错误消息。显然出了点问题,但我似乎无法弄清楚如何解决这个问题。
这是我正在运行的客户端代码(在 rails rspec 文件中):
client = Google::APIClient.new
key_file = '/Users/stu/projects/br/rails-app/######-privatekey.p12'
key = Google::APIClient::KeyUtils.load_from_pkcs12(key_file, 'notasecret')
Rails.logger.info "Private key? #{key.private?}"
asserter = Google::APIClient::JWTAsserter.new(
'#####-#######knp@developer.gserviceaccount.com',
"https://www.googleapis.com/auth/calendar",
key)
client.authorization = asserter.authorize()
我被卡住了,绝对会感谢任何故障排除建议。
谢谢!
更新
感谢您分享适用于您的代码,Jack。
我已经转到我网站的开发控制台并创建了一个服务帐户客户端 p12 密钥。然后我去了该站点的管理控制台并添加了我的客户端 ID,以向日历 API 授予站点范围的授权
在添加授权后的管理控制台中,它看起来像这样: XXXXXXXXXXXhnq.apps.googleusercontent.com 日历(读写) https://www.googleapis.com/auth/calendar
我下载了 p12 密钥并在您提供的代码结构中使用它。我还尝试了 Steve Bazyl 演讲中的方法:
asserter = Google::APIClient::JWTAsserter.new(
"XXXXXXXXXXX-hnq@developer.gserviceaccount.com",
"https://www.googleapis.com/auth/calendar",
key)
client.authorization = asserter.authorize("stu@XXXXXXXXXX.com")
在这两种情况下,我都会得到与以前相同的输出:
Signet::AuthorizationError:
Authorization failed. Server message:
{
"error" : "invalid_grant"
}
如果我输入垃圾而不是“XXXXs://www.googleapis.com/auth/calendar”,我会得到相同的输出。密钥是有效的,虽然很明显我做错了什么,但我在 API 或谷歌中找不到任何关于如何判断它是什么的线索。
任何想法如何解决?