Google API客户端机密未能加载issued_at

时间:2014-09-01 07:32:37

标签: ruby google-api google-api-ruby-client

当我尝试与Google进行OAuth2连接时,收到以下错误消息。

.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/google-api-client-0.7.1/lib/google/api_client/auth/file_storage.rb:49:in `at': can't convert nil into an exact number (TypeError)

查看source这是尝试读取缓存的凭据文件,并且无法解析名为issued_at的属性。

我最初使用google开发者控制台中的错误端口设置了我的应用。现在我已经更新了client_secrets.json,但我不断收到此错误。

我的代码正在尝试从google网站执行calendar example,但转换为使用管理目录API,但它没有超越auth步骤。

此缓存值来自何处?

require 'rubygems'
require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/file_storage'
require 'sinatra'
require 'logger'

enable :sessions

CREDENTIAL_STORE_FILE = "client_secrets.json"

def logger; settings.logger end

def api_client; settings.api_client; end

def directory_api; settings.directory; end

def user_credentials
  # Build a per-request oauth credential based on token stored in session
  # which allows us to use a shared API client.
  @authorization ||= (
    auth = api_client.authorization.dup
    auth.redirect_uri = to('/oauth2callback')
    auth.update_token!(session)
    auth
  )
end

configure do
  log_file = File.open('directory.log', 'a+')
  log_file.sync = true
  logger = Logger.new(log_file)
  logger.level = Logger::DEBUG

  client = Google::APIClient.new(
    :application_name => 'Ruby Directory sample',
    :application_version => '1.0.0')

  puts "store file : #{CREDENTIAL_STORE_FILE}"

  file_storage = Google::APIClient::FileStorage.new(CREDENTIAL_STORE_FILE)
  if file_storage.authorization.nil?
    client_secrets = Google::APIClient::ClientSecrets.load
    client.authorization = client_secrets.to_authorization
    client.authorization.scope = 'https://www.googleapis.com/auth/admin.directory.user'
  else
    client.authorization = file_storage.authorization
  end

  # Since we're saving the API definition to the settings, we're only retrieving
  # it once (on server start) and saving it between requests.
  # If this is still an issue, you could serialize the object and load it on
  # subsequent runs.
  directory = client.discovered_api('admin', "directory_v1")

  set :logger, logger
  set :api_client, client
  set :directory, directory
end

before do
  # Ensure user has authorized the app
  unless user_credentials.access_token || request.path_info =~ /\A\/oauth2/
    redirect to('/oauth2authorize')
  end
end

after do
  # Serialize the access/refresh token to the session and credential store.
  session[:access_token] = user_credentials.access_token
  session[:refresh_token] = user_credentials.refresh_token
  session[:expires_in] = user_credentials.expires_in
  session[:issued_at] = user_credentials.issued_at

  file_storage = Google::APIClient::FileStorage.new(CREDENTIAL_STORE_FILE)
  file_storage.write_credentials(user_credentials)
end

get '/oauth2authorize' do
  # Request authorization
  redirect user_credentials.authorization_uri.to_s, 303
end

get '/oauth2callback' do
  # Exchange token
  user_credentials.code = params[:code] if params[:code]
  user_credentials.fetch_access_token!
  redirect to('/')
end

get '/' do

    result = api_client.execute(:api_method => directory.users.list)

  # # Fetch list of events on the user's default calandar
  # result = api_client.execute(:api_method => calendar_api.events.list,
  #                             :parameters => {'calendarId' => 'primary'},
  #                             :authorization => user_credentials)
  [result.status, {'Content-Type' => 'application/json'}, result.data.to_json]
end

1 个答案:

答案 0 :(得分:1)

将行更改为CREDENTIAL_STORE_FILE = "#{$0}-oauth2.json",然后根据惯例将您从Google信息中心下载的json重命名为client_secrets.jsonCREDENTIAL_STORE_FILE是您的OAuth令牌存储的位置,由FileStorage实例创建。