TodoアプリなAPIサーバをRubyのWAFであるGrapeで作ってみました。

利用技術はこんな感じ↓

  • APIフレームワーク => Grape(Railsにマウント)
  • 認証用の画面 => Rails + Devise
  • OAuth2.0 => doorkeeper

Rubyは2.2.4、Railsは5.0.0.1です。

アプリケーションの作成

毎度お決まりのアプリ作成

Gemfileに以下を追記。

いつものbundle install

.gitignoreに追加

Devise関連のインストール(設定は以前の記事を参照)

doorkeeper用の各種ファイルを作成

マイグレーションファイルには以下を追記

Taskモデルを作成する

マイグレーションファイルはこんな感じで

Userモデル、Taskモデルにアソシエーションを貼る

API用のディレクトリを作成。

app/api/v1/task.rbを作成。モジュール名とファイルパスは合わせる必要があるようです。

routesでGrapeをマウント追加

doorkeeperのOAuth2設定(config/initializers/doorkeeper.rb)。認証しているかどうかの判定ロジックを記述する。OAuthダンスの認証部分。

config/application.rbに追記(apiディレクトリも自動的にロードする)。CORS対応も追記。

最後にマイグレーション

起動して確認

あとは{APP_HOST}/oauth/applicationsにアクセスして、アプリケーションの登録をするとCLIENT_ID、CLIENT_SECRETが発行されるので、OAuthダンスしてaccess_tokenを取得すればOK。

また、OAuth2.0の各画面のビューのカスタマイズは以下のコマンドでビューファイルをジェネレートして弄れば良いです。

ちょっとハマったところ

最初application.rbのパス追加を以下のように記述していた。

この状態でTaskモデルを呼び出そうとすると、以下のようなエラーが発生した。

モジュール名を含めた名前解決でエラーになっているっぽかった。{APPLICATION_PATH}/app/apiまでのパスを通すようにしたら、正常に動いてめでたしめでたし。

参考URL