Rails / Ruby / OAuth2.0
Doorkeeperを使うとデフォルトの認証画面を使うのが定番のようですが、自前で認証画面を用意したりRakeタスクでアクセストークンを発行したいことがあったりします。
ということで、Railsコンソールからアクセストークンの発行までやってみました。
Doorkeeper インストール
まずはRailsプロジェクトのGemfileにDoorkeeper gemを追加してbundle install
します。
今回はdoorkeeper-2.1.4が入りました。
続いてActiveRecord用の設定&テーブルを作成します。
こうするとデータベースに
- oauth_applications
- oauth_access_grants
- oauth_access_tokens
というテーブルが作られます。
Doorkeeperを設定
Doorkeeperをインストールするとconfig/initializers/doorkeeper.rb
に設定ファイルも作られます。
Deviseユーザーを認証する場合は
という感じでresource_owner_authenticator
を設定します。
また、インストール時にconfig/routes.rb
も更新されますが、今回はDoorkeeperのアプリケーションは使わないので元に戻しておきます。
OAuth2アプリケーションの作成
続いてRails ConsoleからOAuth2アプリケーションを作成します。
ActiveRecordの場合はDoorkeeper::Application
オブジェクトを作ればOKです。
作成したアプリケーションのID(Client ID)とClient Secretを確認します。
ということで無事OAuth2認証用アプリケーションが作成できました。
認証コードの生成
続いて認証コードの生成です。
認証コードの生成にはDoorkeeper::OAuth::CodeRequest
クラスを使います。
こんな感じでDoorkeeper::AccessGrant
モデルのオブジェクトを取得します。
取得した認証コードを確認してみます。
アクセストークンの生成
認証コードを取得したので、続いてアクセストークンを生成します。
取得したアクセストークンを確認してみます。
これでOAuth2認証に必要なアクセストークンが手に入りました。
OAuth2.0認証対応のAPIを作る
アクセストークンは作りましたが、APIがないと試せないのでGrapeを使って簡単なAPIを作ります
Grape gemをインストール
Gemfileにgrapeとgrape-active_model_serializersを追加してbundle install
します。
バージョンはgrape-0.11.0, grape-active_model_serializers-1.3.2が入りました。
API用のディレクトリを設定
app/api
を読み込むようにします。
サンプルAPIを作成
とりあえず簡単なAPIを作ります。
サンプルAPIにアクセスしてみる
APIにアクセスしてみると401 Unauthorized
になっています。
アクセストークンを使ってAPIにアクセスしてみる
アクセストークンの発行もAPIの用意もできたので、OAuth2 gemを使ってAPIを呼び出してみます。
レスポンスの内容を確認してみます。
ちゃんとOAuth2認証APIを呼び出すことができました。
まとめ
今回はDoorkeeper + GrapeでOAuth2認証APIを作ってみました。
認証機能付きAPIだと定番かと思いますのでよろしければご参考にどうぞ。
おまけ
今回GrapeでAPIを作りましたが、最初に試した時はGrapeのバージョンが古くて
とか
というエラーが出たりしました。
こういう時はbundle update grape grape-active_model_serializers
でバージョンを上げればOKです。
また、grape-active_model_serializers
のバージョンを上げるとactive_model_serializers
のバージョンも上がります。
このとき古いDraperを使っている場合は
というエラーが出たりします。
そういう場合はbundle update draper
でDraperのバージョンも上げましょう。