通过Rails连接到Google日历的API

时间:2017-01-03 17:46:30

标签: ruby-on-rails ruby google-api google-calendar-api ruby-on-rails-5

我正在创建一个非常简单的Rails应用程序,其中包含一个特定目的:将日历事件添加到Google日历帐户。

我正在关注Ruby Guide from the Google Calendar API

我能够运行提供的测试代码(仅限Ruby,没有框架),但是我很难从Rails项目访问凭据,而且我不确定正确的(“惯用”?)方式做它并组织项目。

部分流程使用OAuth 2.0,因为此目标需要访问Google用户的私人数据(包括读取和写入),我正在遵循Using OAuth 2.0 for Web Services说明。

现在我对最佳做法和/或组织代码的正确方法有几个不同的问题:

  1. Google提供了一个 client_secret.json ,它具有访问该应用程序的凭据。我应该把它留在哪里?我应该将它保存在开发环境中的 .env 文件中以及(在我的情况下)生产环境中Heroku的 ENV VARS 中吗?

  2. 我尝试将 client_secret.json 文件保存在项目的根文件夹中(与 Gemfile 相同的路径),将其添加到 .gitignore 但我无法require "#{Rails.root}/client_secret.json"

    /Users/jsoifer/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require': No such file to load -- /Users/jsoifer/Developer/Tiny-Things/tiny-booking/client_secret.json (LoadError)
    
  3. 我创建了一个services/文件夹,将Google日历相关代码放入其中,但我不确定是否应将其置于控制器中。我应该如何组织这个?

  4. 重要考虑因素: 我没有使用任何其他身份验证/授权方法,例如 Devise 或其他方法,我现在不打算这样做。我只想获得Google的授权令牌并创建日历活动。

    Github Project Link

1 个答案:

答案 0 :(得分:0)

我能够弄清楚这一点并将发布以下每个问题的答案:

  1. One of the possible locations client_secret.json 文件为config/client_secret.json。 在Heroku中运送到Production时,请使用ENV Vars。

  2. 要求不是导入json文件中的凭据的适当方法。 使用Google::APIClient::ClientSecrets.load( File.join( Rails.root, 'config', 'client_secret.json' ) )(假设文件确实在config/

  3. There are several different alternatives关于如何组织代码。我最终创建了一个服务文件夹和一个包含授权逻辑的google_calendar.rb类。

  4. 以下代码:

    app/services/google_calendar.rb

    require 'google/api_client/client_secrets'
    require 'google/apis/calendar_v3'
    
    class GoogleCalendar 
      # Attributes Accessors (attr_writer + attr_reader)
      attr_accessor :auth_client, :auth_uri, :code
    
      def initialize
    
        # ENV: Development
        # Google's API Credentials are in ~/config/client_secret.json
        client_secrets = Google::APIClient::ClientSecrets.load( File.join( Rails.root, 'config', 'client_secret.json' ) )
        @auth_client = client_secrets.to_authorization
    
        # Specify privileges and callback URL
        @auth_client.update!(
          :scope => 'https://www.googleapis.com/auth/calendar',
          :redirect_uri => 'http://localhost:3000/oauth2callback'
        )
    
        # Build up the Redirecting URL
        @auth_uri = @auth_client.authorization_uri.to_s
    
      end
    
    end
    

    app/controllers/application_controller.rb

    class ApplicationController < ActionController::Base
      protect_from_forgery with: :exception
    
      # Starting action in config/routes.rb
      def welcome
    
        # Redirect to Google Authorization Page
        redirect_to GoogleCalendar.new.auth_uri
    
      end
    
      def token
        # Get a auth_client object from Google API
        @google_api = GoogleCalendar.new
    
        @google_api.auth_client.code = params[:code] if params[:code]
        response = @google_api.auth_client.fetch_access_token!
    
        session[:access_token] = response['access_token']
    
        # Whichever Controller/Action needed to handle what comes next
        redirect_to new_event_path()
      end
    
    end