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 ...
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}) " end render text: display_str end end
3. Link liên quan
- Github: https://github.com/xuanduc987/rails_gcalendar
- https://developers.google.com/api-client-library/ruby/auth/web-app