プロジェクトの作成
$ 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
ここまでの流れをテンプレート化したいね。