@znz blog

ZnZ の memo のようなもの

Rails 4.1 で Doorkeeper を使った OAuth2 Provider のサンプルを実装した

| Comments

ソースは 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 を使いました。

ユーザー情報追加

とれる情報を増やすために Username を追加しました。 devise-i18n-views を使っている関係で view のカスタマイズはしていないので、 rake db:seed で設定したユーザーだけ name が設定されています。

必要に応じて view もカスタマイズしてください。

また devise-i18n の ja.yml を devise.ja.yml として入れています。 これは flash のメッセージやメールのメッセージなど、 app/views 以外の翻訳になるようです。

devise-i18n-viewsapp/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 のアクセス制限

cancancanrolify を使って admin role があるユーザーだけに制限しています。 secret も見えてしまうので、 read 権限までしっかり制限する必要があるようです。

load_and_authorize_resource でのロードと親クラス (Doorkeeper::ApplicationsController) の中でのロードでモデルの読み込みが二重になってしまうのですが、変更を少なくするためにそこは許容しました。

GET /api/v1/me.json

Doorkeeper gem の Wiki の例にあるようにユーザー情報をとれるようにしています。 制限していないと以下のような情報がとれました。

1
2
3
4
5
{ "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 追記)

新規投稿の POSTCSRF チェックにひっかかってしまうので、 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 対応などを入れました。

Comments