尝试在ruby中将服务器授权为服务器类型应用程序以访问Google日历时无效授权

Nul*_*uli 6 ruby google-calendar-api google-api sinatra

我正在尝试为自己创建一个直接连接到我的日历的应用程序......但我从不想参与重新验证.我只想编写一次身份验证代码并完成它.

验证码如下:

key = Google::APIClient::PKCS12.load_key(SERVICE_ACCOUNT_PKCS12_FILE_PATH, PASSWORD)
asserter = Google::APIClient::JWTAsserter.new(
    SERVICE_ACCOUNT_EMAIL,
    'https://www.googleapis.com/auth/calendar', 
    key)
@client = Google::APIClient.new
@client.authorization = asserter.authorize#(SERVICE_ACCOUNT_EMAIL)
@client
Run Code Online (Sandbox Code Playgroud)

我的SERVICE_ACCOUNT_...PKCS .文件和我的Sinatra应用程序一起位于目录的根目录中.
我已在我的Gmail帐户上启用了Google Calendar API.

我一直在寻找一种身份验证方法:https: //code.google.com/p/google-api-ruby-client/(在授权下,它谈到服务器到服务器的通信)

$ ruby server.rb 
Faraday: you may want to install system_timer for reliable timeouts
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/faraday-0.8.4/lib/faraday/utils.rb:16: warning: already initialized constant KeyMap
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/faraday-0.8.4/lib/faraday/utils.rb:177: warning: already initialized constant DEFAULT_SEP
W, [2013-01-15T09:52:11.371122 #28607]  WARN -- : Google::APIClient - Please provide :application_name and :application_version when initializing the client
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/signet-0.4.4/lib/signet/oauth_2/client.rb:869:in `fetch_access_token': Authorization failed.  Server message: (Signet::AuthorizationError)
{
  "error" : "invalid_grant"
}
    from /home/me/.rvm/gems/ruby-1.8.7-p371/gems/signet-0.4.4/lib/signet/oauth_2/client.rb:882:in `fetch_access_token!'
    from /home/me/.rvm/gems/ruby-1.8.7-p371/gems/google-api-client-0.6.1/lib/google/api_client/auth/jwt_asserter.rb:116:in `authorize'
    from server.rb:32:in `build_client'
    from server.rb:38
Run Code Online (Sandbox Code Playgroud)

问题可能是什么?为什么我收到此错误? - 特别是因为我已经复制了google gem网站上的代码.

更新:

发现了这个:

invalid_grant试图从谷歌获取oAuth令牌

说我应该这样做:"确保在请求中指定access_type = offline."

我如何使用红宝石宝石做到这一点?没有完全重做http请求?

小智 0

这是一个工作代码,除了最后一行之外,它是相似的,它应该包含实际拥有日历的用户(您)的电子邮件。我假设服务帐户电子邮件不是您的电子邮件。

client_asserter = Google::APIClient::JWTAsserter.new(
    config['client_email'],
    PLUS_LOGIN_SCOPE,
    key
)
$client.authorization = client_asserter.authorize(config['user_email'])
Run Code Online (Sandbox Code Playgroud)

另外,请确保正确创建服务帐户。我使用了这个指南: https: //developers.google.com/+/domains/authentication/delegation,这是针对域API的,但第一部分应该是相同的。

另外,您不需要另一个身份验证范围吗?

这是我为我工作的完整示例(ruby): https: //github.com/admitriyev/propellant/blob/master/main.rb