Подключение к API Календаря Google через Rails

Я создаю действительно простое приложение Rails с одной конкретной целью: добавить событие Календаря в учетную запись Календаря Google.

Я следую Руководству по Ruby из Google Calendar API .

Мне удалось запустить предоставленный тестовый код (только Ruby, без фреймворка), но мне трудно получить доступ к учетным данным из проекта Rails, и я не уверен в правильном («идиоматическом»?) Способе сделать это, и организовать проект.

Часть процесса использует OAuth 2.0, поскольку для этой цели требуется доступ к личным данным пользователя Google (как для чтения, так и для записи), я следую Инструкции по использованию OAuth 2.0 для веб-служб.

Прямо сейчас у меня есть несколько разных вопросов относительно лучших практик и / или правильного способа организации кода:

  1. Google предоставляет client_secret.json, у которого есть учетные данные для доступа к приложению. Где мне его хранить? Должен ли я хранить его в файле .env в среде разработки и (в моем случае) в ENV VARS Heroku в производственной среде?

  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, но я не был уверен, стоит ли мне помещать ее в контроллер. Как мне это организовать?

Важное замечание: я не использую никакие другие методы аутентификации / авторизации, такие как Devise или другие, и не планирую делать это прямо сейчас. Я просто хочу получить токен авторизации Google и создать событие календаря.

Ссылка на проект Github


person Jonathan Soifer    schedule 03.01.2017    source источник


Ответы (1)


Я смог понять это и опубликую ответ на каждый из вопросов ниже:

  1. Один из возможное расположение файла client_secret.json: config/client_secret.json. При отправке в производство в Heroku используйте ENV Vars.

  2. Требовать - не лучший способ импортировать учетные данные в файл json. Используйте Google::APIClient::ClientSecrets.load( File.join( Rails.root, 'config', 'client_secret.json' ) ) (при условии, что файл действительно находится в config/.

  3. Существует несколько различных альтернатив того, как организовать код. В итоге я создал папку служб и класс google_calendar.rb, содержащий логику авторизации.

Вот код:

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
person Jonathan Soifer    schedule 04.01.2017