自社サービスの機能を簡単にAPIで提供出来てしまう!gem doorkeeperが凄い。

自社サービスにAPIを実装する事ってあまりないですよね。
kamadoのプロダクトも現在はAPIは公開してません。

もし提供するのであれば、簡易的な方法ですが、ユーザーテーブルにtokenカラムを追加して、API用のルーティングを作成する…という方法が考えられると思います。

しかし、その実装時間でより良いAPIが実装出来るとしたら素晴らしいですよね。

そこで紹介したいのがgem doorkeeperです。
日本語の記事が見当たらなかったので記事にしました。

gem doorkeeperってどんな機能があるのか?

簡単に説明すると、
・アプリケーションの管理機能
・アプリケーションの承認管理
・スコープの設定

いってしまえば、Facebook API(に近い実装)そのまま実装出来ます。
しかもOAuth2.0を利用できます! ← 超重要

実際にやってみる

Gemfileに追加

gem 'doorkeeper', '~> 0.4.2'

コマンドの実行

bundle install
rails generate doorkeeper:install
rails generate doorkeeper:migration
rake db:migrate

これでconfig/initializers/doorkeeper.rbが作成され、DBがマイグレートされます。


次にroutesに追加

mount Doorkeeper::Engine => '/oauth'


以下がroutesに追加されます。

Routes for Doorkeeper::Engine:
          authorization GET    /authorize(.:format)                   doorkeeper/authorizations#new
          authorization POST   /authorize(.:format)                   doorkeeper/authorizations#create
          authorization DELETE /authorize(.:format)                   doorkeeper/authorizations#destroy
                  token POST   /token(.:format)                       doorkeeper/tokens#create
           applications GET    /applications(.:format)                doorkeeper/applications#index
                        POST   /applications(.:format)                doorkeeper/applications#create
        new_application GET    /applications/new(.:format)            doorkeeper/applications#new
       edit_application GET    /applications/:id/edit(.:format)       doorkeeper/applications#edit
            application GET    /applications/:id(.:format)            doorkeeper/applications#show
                        PUT    /applications/:id(.:format)            doorkeeper/applications#update
                        DELETE /applications/:id(.:format)            doorkeeper/applications#destroy
authorized_applications GET    /authorized_applications(.:format)     doorkeeper/authorized_applications#index
 authorized_application DELETE /authorized_applications/:id(.:format) doorkeeper/authorized_applications#destroy


config/initializers/doorkeeper.rbの編集。
認証システムにdeviseを使用している場合下記の様にする。

resource_owner_authenticator do |routes|
  current_user || warden.authenticate!(:scope => :user)
end


コントローラーの作成
app/controllers/api/v1/users_controller.rb

class Api::V1::UsersController < ApplicationController
  doorkeeper_for :all
  before_filter :validate_token
  before_filter :set_parameters
  skip_before_filter :verify_authenticity_token # allow CSRF

  def index
    render json: current_user
  end

  def validate_token
    return head(401) unless doorkeeper_token
  end

  def set_parameters
    sign_in 'user', User.find(doorkeeper_token.resource_owner_id)
  end

end

これで実装完了です。
画面で確認してみます。

OAuthプロバイダー側の画面遷移確認

/oauth/applicationsでアプリケーションの作成を行えます。

アプリケーションを作成




出来てますねー。

OAuthクライアント側の実行確認

実際にクライアント側から確認してみます。
下記にexampleがあるので確認に便利です。
https://github.com/applicake/doorkeeper-devise-client


こちらも出来てますね!


OAuthクライアント側(CUI)の実行確認

CUIからも確認してみます。

リダイレクトURL作成
require 'oauth2'

#clientの作成
client = OAuth2::Client.new('c5e0e923b1a257029f22dfec34056c4908f07aae67d2b00ec42d2c6e5a131637', '7f90a491763d8fe5b0419b7bc0d52c762cc2000e8d892b57f814e6aef23541c4', :site => 'http://localhost:5000')

# 認証へのリダイレクトURL作成
p client.auth_code.authorize_url(:redirect_uri => 'http://localhost:3000/users/auth/doorkeeper/callback')

#=> "http://localhost:5000/oauth/authorize?response_type=code&client_id=c5e0e923b1a257029f22dfec34056c4908f07aae67d2b00ec42d2c6e5a131637&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fusers%2Fauth%2Fdoorkeeper%2Fcallback"
トークンの取得
# トークンの取得
p client.auth_code.get_token('90cfef8de3a3c5712c6a95acd9e48f7f5355265ec462378a58c56748fd743932', :redirect_uri => 'http://localhost:3000/users/auth/doorkeeper/callback').token

#=> "38c5fcdb2d1c90d63593859c367d999049ba084817a688347e7664b24dcfed10"
API実行
p OAuth2::AccessToken.new(client, "38c5fcdb2d1c90d63593859c367d999049ba084817a688347e7664b24dcfed10").get('/api/v1/users').body

#=> {...}

承認済みアプリケーションの管理

承認済みのアプリケーションを表示するviewが用意されているのも気がきいています。

OAuthでAPIが提供出来るメリット

OAuthで通信出来るメリットって色々あると思うのですが、既に存在するgem oauth2等を利用できる事でAPIを実行するためのパッケージを簡単に実装出来るのが素晴らしいですね。

詰まったら

exampleがあります。
https://github.com/applicake/doorkeeper/wiki/Example-Applications

まとめ

ざっと試してみましたが、gem doorkeeperでこんなに簡単にAPIが実装出来るなんて素晴らしいですね。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/