ソースは github の znz/doorkeeper-provider-app で公開しています。
基本的にはソースをみて参考にしてもらうと良いと思いますが、 説明が必要な部分を続きに書いてみました。
対象バージョン
- ruby 2.1.2
- rails 4.1.4
- bootstrap-sass 3.2.0.0
- devise 3.2.4
- devise-i18n-views 0.2.8
- doorkeeper 1.3.1
- cancancan 1.8.4
- rolify 3.4.0
- rspec-rails 3.0.1
試し方
README に書いたようにローカルで動かすか heroku に deploy して Example Applications にある Client examples の Sinatra and OAuth2 gem の Doorkeeper Sinatra Client を使って試しました。
初期設定
devise, doorkeeper, cancancan, rolify, rspec の個別の初期設定は普通に rails generate
を使いました。
ユーザー情報追加
とれる情報を増やすために User
に name
を追加しました。 devise-i18n-views
を使っている関係で view のカスタマイズはしていないので、 rake db:seed
で設定したユーザーだけ name
が設定されています。
必要に応じて view もカスタマイズしてください。
また devise-i18n
の ja.yml を devise.ja.yml として入れています。 これは flash のメッセージやメールのメッセージなど、 app/views
以外の翻訳になるようです。
devise-i18n-views
は app/views
を翻訳可能な view にするプロジェクトです。 なぜ devise
とは別プロジェクトでやっているのかはよくわかりません。
I18n.available_locales
devise-i18n-views
を入れてしまうと I18n.available_locales
が増えてしまうので、 困るのなら、カスタマイズ用の view を generate して、必要な言語だけ取り込んで Gemfile
から外してしまうのが良いと思います。
今回はそのまま残して右上の Locale
で選択できるようにしています。 選択肢の翻訳は Wikipedia の左や www.debian.org の下などを参考にしたのですが es-AR
はわからなかったので、 es
と同じになってしまっています。
/oauth/applications のアクセス制限
cancancan
と rolify
を使って admin role があるユーザーだけに制限しています。 secret も見えてしまうので、 read 権限までしっかり制限する必要があるようです。
load_and_authorize_resource
でのロードと親クラス (Doorkeeper::ApplicationsController
) の中でのロードでモデルの読み込みが二重になってしまうのですが、変更を少なくするためにそこは許容しました。
GET /api/v1/me.json
Doorkeeper gem の Wiki の例にあるようにユーザー情報をとれるようにしています。 制限していないと以下のような情報がとれました。
{ "id": 1,
"email": "admin@example.com",
"created_at": "2014-07-11T06:32:22.077Z",
"updated_at": "2014-07-11T09:33:42.143Z",
"name": "admin" }
制限したり関連するモデルの情報を増やしたりするなら Rails のモデル関係と to_json(to_xml) - すがブロ に書いてあるように respond_with
に :only
をつけたり :include
をつけたりすると出来るようです。
入ったり入らなかったりする条件がよくわからなかったのですが、 devise
関連では authentication_token
が入っていることがあったので、 User モデルにいろんな情報を入れているなら、 きちんと制限した方が良さそうに思いました。
microposts
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう のように Micropost
モデルを作成して、 API からも投稿できるようにしました。
投稿は scope で制限していて、デフォルトの public
のみでは書き込めずに write
も必要にしています。
API としては
-
GET /api/v1/microposts
で投稿一覧 -
POST /api/v1/microposts
で新規投稿
を用意しています。
Can’t verify CSRF token authenticity
(2014-07-15 追記)
新規投稿の POST
は CSRF
チェックにひっかかってしまうので、 skip_before_action :verify_authenticity_token
を入れました。
以前から doorkeeper gem を使っているアプリでは Can't verify CSRF token authenticity
というメッセージが出るだけで投稿自体は出来ていたのですが、 サンプルアプリでは投稿できなかったので、 skip_before_action
を入れました。 (Rails 4 なので skip_before_filter
ではなく skip_before_action
)
その後の変更点 (2014-07-15 追記)
その後 kaminari
対応などを入れました。