プロジェクトの作成

$ padrino g project -e erb -d mongomapper todos
$ cd todos

Gemfileに以下を追加

gem 'omniauth'
gem 'omniauth-facebook'

ばんどる。

$ bundle install

Accountモデルの作成

$ padrino g model Account name:string role:string uid:string uid:string provider:string

AccountクラスにOmniAuthの認証データからAccountを作成するメソッドを追加。

def self.create_with_omniauth(auth)
  create!(provider: auth['provider'],
          uid: auth['uid'],
          name: auth['name'],
          role: 'users'
         )
end

AccessControl

app.rbにアクセスコントロールの設定を追加。

register Padrino::Admin::AccessControl

use OmniAuth::Builder do
  provider :facebook, ENV['FB_APP_ID'], ENV['FB_APP_SECRET']
end

set :login_page, '/'

access_control.roles_for :any do |role|
  role.protect '/profile'
  role.protect 'admin'
end

access_control.roles_for :users do |role|
  role.allow '/profile'
end

Controller

app/controllers.rb:

Todos.controllers do
  get :index do
    render :index
  end

  get :profile do
    content_type :text
    current_account.to_yaml
  end

  get :destroy do
    set_current_account(nil)
    redirect url(:index)
  end

  get :auth, :map => '/auth/:provider/callback' do
    auth = request.env['omniauth.auth']
    account = Account.find_by_provider_and_uid(auth['provider'], auth['uid']) ||
      Account.create_with_omniauth(auth)
    set_current_account(account)
    redirect 'http://' + request.env['HTTP_HOST'] + url(:profile)
  end
end

View

app/views/index.erb:

その他

MacだとOpenSSLで弾かれちゃうのでなかったことにする。

config/boot.rb:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

ここまでの流れをテンプレート化したいね。