Sinatra + Authlogic をやる。

Herokuをもっと軽く使っていこうとSinatraをいじっています。

そうなると認証が問題ですが、手に馴染んだAuthlogicを使いたいとおもいました。

軽くぐぐったところ、ログインセッション管理がデータベース仕様の時代のものだけだったので、メモを残しておきます。

ソースとそれをHerokuにそのまま乗せたもの

mmmpa/authlogic_with_sinatra

https://mmmpa-sinatra-authlogic.herokuapp.com

キモ

AuthlogicはSinatraでも使えるようにSinatraAdapterを持っており、自動でincludeされるので、特にややこしいことをせずに使えます。

ただしSinatraでセッションを有効にするのを忘れると、自分でクッキーを食わせたりするハメになって無駄な時間を使うので気をつけましょう(使いました)。

enable :sessions

あとはSinatraでActiveRecordを使えるようにすれば、Railsとほぼ同じ手順で扱えますので、以下は蛇足みたいな内容です。

ActiveRecordの準備

データベースの準備

config/database.ymlに設定を書いておくとgemがよしなにしてくれるようです。

Sinatra仕様でもHerokuにpushすると自動にすげかえてくれるので便利ですね。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: <%= ENV['PG_USER'] %>
  password: <%= ENV['PG_PASSWORD'] %>

development:
  <<: *default
  database: <%= ENV['PG_DATABASE_NAME'] %>_development

マイグレーション

以下をすることにより、おなじみのrake db:migrateなどが使えます。

gem 'sinatra-activerecord'
require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'

マイグレーションファイルを作成する。Authlogicのattributesはお好みで。

bundle exec rake:create_migration NAME=create_user
class CreateUser < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :login, null: false
      t.string :email, null: false

      t.string :crypted_password, null: false
      t.string :password_salt, null: false

      t.string :persistence_token
      t.string :single_access_token
      t.string :perishable_token

      t.integer :login_count, default: 0, null: false
      t.integer :failed_login_count, default: 0, null: false
      t.datetime :last_request_at
      t.datetime :current_login_at
      t.datetime :last_login_at
      t.string :current_login_ip
      t.string :last_login_ip

      t.timestamps null: false
    end
  end
end

Authlogicの準備

Railsで使うときと設定内容は同じです。

User

require 'active_record'
require 'authlogic'

class User < ActiveRecord::Base
  acts_as_authentic do |config|
    config.login_field = :login
    config.require_password_confirmation = false
  end
end

UserSession

require 'authlogic'

class UserSession < Authlogic::Session::Base
end

Sinatraの準備

セッションを有効に

大切です。忘れると時間を無駄に費やします。

enable :sessions

Sinatra+ActiveRecordで発生するタイムアウト対策を

after do
  ActiveRecord::Base.connection.close
end

ルーティング

承認あたりはこんな感じで。

before '/room' do
  redirect '/in' unless !!UserSession.find
end

before '/in' do
  redirect '/room' if !!UserSession.find
end

作成、セッション開始などはいつものAuthlogicです。

authlogic_with_sinatra/app.rb at master · mmmpa/authlogic_with_sinatra

あと

Authlogicに限らずですがCSRF対策とかないので、そこらへんをどうにかして軽く動かしていけるようになりたい。