Ruby on Rails を使って Dropbox の API を呼び出してファイルを送信したかったので少し調べてみました。DropboxAPI は事前に OAuth 認証でアクセストークンを取得しておき、そのトークンを使って API にアクセスするという一般的なやり方です。
Dropbox アプリの作成
まずは Dropbox のアプリを作らないといけません。アプリに対してユーザーが認証を行ってアクセストークンを発行してもらいます。Dropbox のアプリは https://www.dropbox.com/developers/apps ここから作ることが出来ます。この記事では Dropbox アプリは作成済みの前提で進めていきます。
ちなみに Dropbox アプリは作り方によって、フルアクセスだったり特定の権限しかもらえなかったりします。アプリを作る時に、ウィザード形式でいくつか質問がありますのでそれに答えていく形になります。
アクセストークンの取得
Dropbox の OAuth 認証は OAuth 1.0 と OAuth 2.0 の2つのバージョンがあります。Dropbox としては OAuth 1.0 でも OAuth 2.0 でもどちらでもアクセストークンを取得できる API は用意されているのですが、後述する DropboxSDK がどうも OAuth 2.0にしか対応していない ようなので OAuth 2.0 の方を使います。
omniauth の Dropbox 用ストラテジを準備する
ruby で OAuth 認証するといえば有名なのは omniauth ですね。omniauth の Dropbox 用ストラテジは OAuth 1.0 のものしかありませんでしたので OAuth 2.0 用の gem を作ってみました。
tkengo / omniauth-dropbox-oauth2
で、これを rubygems に登録しようとしたら push 時にエラーが…なんと4日くらい差で先に同じ名前で rubygems に登録してる人がいた!
ということで gem からインストールすると tkengo / omniauth-dropbox-oauth2 じゃなくて bamorin / omniauth-dropbox-oauth2 の方がインストールされます(笑)
omniauth の設定
Gemfile
に以下を追加します。
gem 'omniauth-dropbox-oauth2'
bundle install して
$ bundle install
config/initializers/omniauth.rb
辺りに以下のようなコードを記述します。アプリのキーとシークレットキー、コールバックのURLは適宜自分用に置き換えてください。アプリのキーとシークレットキーは Dropbox の App Console からアプリをクリックして詳細から見れます。
Rails.application.config.middleware.use OmniAuth::Builder do
provider :dropbox_oauth2, 'Dropboxアプリのキー', 'Dropboxアプリのシークレットキー',
:callback_url => 'http://localhost:3000/auth/dropbox_oauth2/callback'
end
そして Rails を起動します。
$ bundle exec rails server
アクセストークンの取得
ここまで出来たらブラウザで http://localhost:3000/auth/dropbox_oauth2
にアクセスしてみると Dropbox の認証用の画面にリダイレクトします。
ここで 許可 をクリックすると config/initializers/omniauth.rb
で設定したコールバックの URL つまり http://localhost:3000/auth/dropbox_oauth2/callback
に戻ってきます。このコントローラーで以下のようにしてアクセストークンを取得できますので、DBなどに保存しておきましょう。
access_token = request.env['omniauth.auth'].credentials.token
DropboxSDK の利用
アクセストークンを取得できたら DropboxSDK を利用して Dropbox の API を叩けます。まずは DropboxSDK のインストールです。gem になっていますので Gemfile
に書きましょう。
gem 'dropbox-sdk'
bundle install すると
$ bundle install
Dropbox の API を呼び出すことができるようになります。DropboxAPI には公式のドキュメントがあり、いろいろと参考になります。また DropboxSDK についても RDoc で生成された公式のドキュメントがあります。これらを参考に、以下のようにして Dropbox にファイルを送信することが出来ます。
# DropboxSDK を使うために require する必要があります。
require 'dropbox_sdk'
# 先に取得したアクセストークンを引数に渡して DropboxClient のインスタンスを生成します。
client = DropboxClient.new(dropbox_access_token)
# ファイル送信の API を呼び出します。
# 1つ目の引数は送り先 Dropbox のフォルダ。2つ目の引数は送り元ファイルのパスです。
# https://www.dropbox.com/static/developers/dropbox-ruby-sdk-1.6.1-docs/DropboxClient.html#method-i-put_file
client.put_file('/Test/test.txt', '/tmp/test.txt')
これで Dropbox にファイルが送信されています。