Kết nối tới Google Calendar từ Rails

1. Giới thiệu

Trong bài viết này, mình sẽ hướng dẫn sử dụng google sdk cho ruby (hiện đang alpha) trong rails để tương tác với dịch vụ Google Calendar.

2. Hướng dẫn chi tiết

2.1 Tạo Project

Đầu tiên, đương nhiên ta cần tạo một project Rails mới:

rails new rails_gcalendar

Và rồi thêm google-api-client vào Gemfile:

gem 'google-api-client', '0.9.pre3'

Sau đó bundle install để bundler làm việc của mình

2.2. Lấy credentials từ Google

Để có thể sử dụng Google Calendar API, app cần phải sử dụng OAuth 2.0 để xác định danh tính của mình.

Để lấy được credentials cho app, ta cần làm các bước sau:

  • Đi đến trang Google Developers Console
  • Chọn hoặc tạo một project mới.
  • Ở phần Dashboard click vào Enable and manage APIs
  • Ở Sidebar bên trái, chọn Credentials
  • Tạo credential bằng cách bấm vào New credentials, chọn OAuth client ID, Application type chọn Web application. Authorized redirect URIs sẽ được dùng để Google redirect về sau khi authenticate, ở project này, điền "http:localhost:3000/oauth2callback"
  • Click biểu tượng bên tay phải của credential để download file thông tin client về, lưu với tên client_secrets.json đặt trong folder project Rails vừa tạo.

2.3 Lấy token từ Google

Trước hết, tạo root_path cho ứng dụng của ta ở đây:

# config/routes.rb
Rails.application.routes.draw do
  root to: "calendars#index"
end
# app/controllers/calendars_controller.rb
class CalendarsController < ApplicationController
  def index
    render text: "Wait a moment"
  end
end

Giờ tạo endpoint cho Google OAuth2 callback.

# app/controllers/oauths_controller.rb
class OauthsController < ApplicationController
  require 'google/api_client/client_secrets'

  def callback
    client_secrets = Google::APIClient::ClientSecrets.load
    auth_client = client_secrets.to_authorization
    auth_client.update!(
      :scope => 'https://www.googleapis.com/auth/calendar.readonly',
      :redirect_uri => oauth2callback_url)

    redirect_to auth_client.authorization_uri.to_s and return if params[:code].blank?

    auth_client.code = params[:code]
    token = auth_client.fetch_access_token
    session[:token] = token

    redirect_to root_path
  end
end

và thêm vào routes.rb

  get "/oauth2callback" => "oauths#callback"

Như vậy, sau khi truy cập http://localhost:3000/oauth2callback và cấp phép quyền truy cập, thì ta sẽ có được token lưu trong cookies.

2.4 Lấy danh sách các sự kiện sắp diễn ra

Để lấy danh sách các sự kiện sắp diễn ra, ta làm như sau:

# app/controllers/calendars_controller.rb
class CalendarsController < ApplicationController
  require 'google/apis/calendar_v3'
  require 'google/api_client/client_secrets'

  Calendar = Google::Apis::CalendarV3

  def index
    redirect_to oauth2callback_path and return if session[:token].blank?

    auth_client = Signet::OAuth2::Client.new
    auth_client.update_token!(session[:token])

    client = Calendar::CalendarService.new
    client.authorization = auth_client

    results = client.list_events(
      "primary",
      single_events: true,
      order_by: 'startTime',
      time_min: Time.now.iso8601,
      time_max: 1.month.from_now.iso8601
    )

    display_str = ""
    results.items.each do |event|
      start_date = event.start.date || event.start.date_time
      display_str << "- #{event.summary} (#{start_date})\n"
    end

    render text: display_str
  end
end

3. Link liên quan