kansiho's memo

ruby, python, javascript. Rails, wordpress, OpenCV, heroku...

【Rails5】Doorkeeper gemでOAuth2.0のためのAPIを作って、rubyクライアントで呼び出す

https://image.slidesharecdn.com/railsgroupp1-160629062609/95/building-mobile-friendly-apis-in-rails-46-638.jpg?cb=1467181703

DooerkeeperはOAuth 2のプロバイダ(認証する側のサーバー)を簡単に実装できるgemです。

意外とハマったので書いておきます!

Doorkeeper gemをインストール

github.com

#Gemfile

gem 'doorkeeper'
gem 'doorkeeper-i18n' # default localeを en 以外で使うなら


#terminal

rails generate doorkeeper:install

rails generate doorkeeper:migration #active record 使うなら

rake db:migrate

routes.rb

Rails.application.routes.draw do

  use_doorkeeper #追加

end

↑で以下のルートが生成されます.

GET       /oauth/authorize/:code
GET       /oauth/authorize
POST      /oauth/authorize
DELETE    /oauth/authorize
POST      /oauth/token
POST      /oauth/revoke
resources /oauth/applications
GET       /oauth/authorized_applications
DELETE    /oauth/authorized_applications/:id
GET       /oauth/token/info

認証ロジックを設定

config/initializers/doorkeeper.rb:

Doorkeeper.configure do
  resource_owner_authenticator do
    User.find_by_id(session[:current_user_id]) || redirect_to(new_user_session_path) // ログインしていなかったら、リダイレクト
  end
end

Doorkeeperで認証を要請したいコントローラで指定します↓

class Api::V1::ProductsController < Api::V1::ApiController
  before_action :doorkeeper_authorize! # Require access token for all actions

  # your actions
end

(rails server restartしてから)

localhost:3000/oauth/authorized_applications

を開いて、アプリケーションを登録し、発行されるclient_id と client_secret をメモっておく。

これにて、最低限のプロバイダ(認証側、アクセスする情報のリソースを持っている側)の設定は終わり。

テスト

require 'oauth2'
client_id= '4ffb177d443ffb177d443ffb177d443ffb177d443ffb177d44' // もちろん適当です. 変えてください.
client_secret= 'd443ffb177d443ffb177d443ffb177d443ffb177d443ffb177'

site = 'http://localhost:3000' # 認可サーバーを起動しているURL. testなのでこれで.  必ずhttpから開始する.
redirect_uri = 'client no url'

client = OAuth2::Client.new(client_id, client_secret, :site => site)
login_url =  client.auth_code.authorize_url(redirect_uri: redirect_uri)

上記のlogin_urlをブラウザに貼ってログインして、リダイレクトされるページの、params code= …..‘ をメモっておく。

client.auth_code.get_token(code, :redirect_uri =>  redirect_uri)

でaccess tokenが取れたら成功です。

注意点

SSLでなくても動作させるには、config/initializers/doorkeeper.rbに

  force_ssl_in_redirect_uri false

の設定が必要。

また、テストではlocalhost:3000 ではなく、 http://localhost:3000 と書くようにします。

また、必ずredirect_uriが  /oauth/authorized_applications で登録したものと一致するようにしてください。

view の編集

$rails generate doorkeeper:views

で、app/view/doorkeeper配下にgemからビューをコピーすることができます。

create mode 100644 app/views/doorkeeper/applications/_delete_form.html.erb
 create mode 100644 app/views/doorkeeper/applications/_form.html.erb
 create mode 100644 app/views/doorkeeper/applications/edit.html.erb
 create mode 100644 app/views/doorkeeper/applications/index.html.erb
 create mode 100644 app/views/doorkeeper/applications/new.html.erb
 create mode 100644 app/views/doorkeeper/applications/show.html.erb
 create mode 100644 app/views/doorkeeper/authorizations/error.html.erb
 create mode 100644 app/views/doorkeeper/authorizations/new.html.erb
 create mode 100644 app/views/doorkeeper/authorizations/show.html.erb
 create mode 100644 app/views/doorkeeper/authorized_applications/_delete_form.html.erb
 create mode 100644 app/views/doorkeeper/authorized_applications/index.html.erb
 create mode 100644 app/views/layouts/doorkeeper/admin.html.erb
 create mode 100644 app/views/layouts/doorkeeper/application.html.erb