自社サービスの機能を簡単に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クライアント側の実行確認
実際にクライアント側から確認してみます。
下記に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 #=> {...}
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/