2016-08-29 5 views
1

Rubin: 2.3.1Google Sheets API v4 service_account - verboten: Der Anrufer keine Berechtigung (Google :: Apis :: ClientError)

Schienen: 5.0.0

Ich brauche um über die Google Tabellen-API auf mein privates Google-Blatt zuzugreifen und dieses zu aktualisieren. Schließlich sollte dies durch einen wiederkehrenden Hintergrundjob in meiner Rails-Anwendung geschehen. Daher habe ich in meiner Google Cloud Console ein Dienstkonto eingerichtet.

Aber mit Google Sheets API zu spielen beginnen ich ein Skript erstellt haben:

require 'google/apis/sheets_v4' 

ENV["GOOGLE_ACCOUNT_TYPE"] = 'service_account' 
ENV["GOOGLE_CLIENT_EMAIL"] = '<client_email_from_downloaded_json_here>' 
ENV["GOOGLE_PRIVATE_KEY"] = "<private_key_from_downloaded_json_here>" 

SCOPE = Google::Apis::SheetsV4::AUTH_SPREADSHEETS 

authorization = Google::Auth.get_application_default(SCOPE) 

# Initialize the API 
service = Google::Apis::SheetsV4::SheetsService.new 
service.authorization = authorization 

spreadsheet_id = '<MY SPREADSHEET ID HERE>' 

sheet_name = 'Sheet1' 

range = "#{sheet_name}!A2:B" 

response = service.get_spreadsheet_values(spreadsheet_id, range) 

puts 'No data found.' if response.values.empty? 

response.values.each do |row| 
    # Print columns A and B, which correspond to indices 0 and 1. 
    puts "#{row[0]}, #{row[1]}" 
end 

Wenn ich ausführen, das Skript

$ rails runner -e development lib/scripts/google_sheets_api_demo.rb 
/home/jignesh/.rvm/gems/[email protected]_integrations/gems/google-api-client-0.9.12/lib/google/apis/core/http_command.rb:211:in `check_status': forbidden: The caller does not have permission (Google::Apis::ClientError) 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/google-api-client-0.9.12/lib/google/apis/core/api_command.rb:102:in `check_status' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/google-api-client-0.9.12/lib/google/apis/core/http_command.rb:179:in `process_response' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/google-api-client-0.9.12/lib/google/apis/core/http_command.rb:286:in `execute_once' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/google-api-client-0.9.12/lib/google/apis/core/http_command.rb:107:in `block (2 levels) in execute' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/retriable-2.1.0/lib/retriable.rb:54:in `block in retriable' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/retriable-2.1.0/lib/retriable.rb:48:in `times' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/retriable-2.1.0/lib/retriable.rb:48:in `retriable' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/google-api-client-0.9.12/lib/google/apis/core/http_command.rb:104:in `block in execute' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/retriable-2.1.0/lib/retriable.rb:54:in `block in retriable' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/retriable-2.1.0/lib/retriable.rb:48:in `times' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/retriable-2.1.0/lib/retriable.rb:48:in `retriable' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/google-api-client-0.9.12/lib/google/apis/core/http_command.rb:96:in `execute' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/google-api-client-0.9.12/lib/google/apis/core/base_service.rb:346:in `execute_or_queue_command' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/google-api-client-0.9.12/generated/google/apis/sheets_v4/service.rb:322:in `get_spreadsheet_values' 
    from lib/scripts/google_sheets_api_demo.rb:35:in `<top (required)>' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/railties-5.0.0/lib/rails/commands/runner.rb:60:in `load' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/railties-5.0.0/lib/rails/commands/runner.rb:60:in `<top (required)>' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:138:in `require' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:138:in `require_command!' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:104:in `runner' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:49:in `run_command!' 
    from /home/jignesh/.rvm/gems/[email protected]_integrations/gems/railties-5.0.0/lib/rails/commands.rb:18:in `<top (required)>' 
    from bin/rails:9:in `require' 
    from bin/rails:9:in `<main>' 

Wenn ich versuche, ein öffentliches Blatt zuzugreifen es funktioniert. Ich habe viel versucht, aber ich konnte nicht herausfinden, was das verursacht. Zunächst verwendete ich für die Zulassung Key Ansatz API aber gemäß der Dokumentation zu https://developers.google.com/api-client-library/ruby/auth/api-keys gefunden, sagt es

Wenn APIs aufrufen, die keine privaten Nutzerdaten zugreifen kann, Sie einfache API-Schlüssel verwenden können. Mit diesen Schlüsseln authentifizieren Sie Ihre Anwendung für Abrechnungszwecke. Die Google Developers Console-Dokumentation beschreibt auch API-Schlüssel.

Hinweis: Wenn Sie auf private Benutzerdaten zugreifen müssen, müssen Sie OAuth 2.0 verwenden. Weitere Informationen finden Sie unter Verwenden von OAuth 2.0 für Webserver-Anwendungen, Verwenden von OAuth 2.0 für installierte Anwendungen und Verwenden von OAuth 2.0 für Server-zu-Server-Anwendungen .

Daher wechselte ich auf Service Account-Ansatz. Aber es hat nicht geholfen.

Kann mir bitte jemand sagen, was ich vermisse?

Weitere Ergebnisse:

Die folgende Beitrag https://stackoverflow.com/a/38530755/936494 sieht hilfreich, aber nach meiner Anforderung mag ich 3-Legged oauth der Grund, das Blatt zu sein vermeiden, sollte durch einen Hintergrund-Job abgerufen und aktualisiert werden.

Antwort

Verwandte Themen