我正在创建一个非常简单的Rails应用程序,其中包含一个特定目的:将日历事件添加到Google日历帐户。
我正在关注Ruby Guide from the Google Calendar API。
我能够运行提供的测试代码(仅限Ruby,没有框架),但是我很难从Rails项目访问凭据,而且我不确定正确的(“惯用”?)方式做它并组织项目。
部分流程使用OAuth 2.0,因为此目标需要访问Google用户的私人数据(包括读取和写入),我正在遵循Using OAuth 2.0 for Web Services说明。
现在我对最佳做法和/或组织代码的正确方法有几个不同的问题:
Google提供了一个 client_secret.json ,它具有访问该应用程序的凭据。我应该把它留在哪里?我应该将它保存在开发环境中的 .env 文件中以及(在我的情况下)生产环境中Heroku的 ENV VARS 中吗?
我尝试将 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)
我创建了一个services/
文件夹,将Google日历相关代码放入其中,但我不确定是否应将其置于控制器中。我应该如何组织这个?
重要考虑因素: 我没有使用任何其他身份验证/授权方法,例如 Devise 或其他方法,我现在不打算这样做。我只想获得Google的授权令牌并创建日历活动。
答案 0 :(得分:0)
我能够弄清楚这一点并将发布以下每个问题的答案:
One of the possible locations client_secret.json 文件为config/client_secret.json
。
在Heroku中运送到Production时,请使用ENV Vars。
要求不是导入json文件中的凭据的适当方法。
使用Google::APIClient::ClientSecrets.load( File.join( Rails.root, 'config', 'client_secret.json' ) )
(假设文件确实在config/
。
There are several different alternatives关于如何组织代码。我最终创建了一个服务文件夹和一个包含授权逻辑的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