はじめに
APIの認証に最適なGemがないかな~と探していました。
どうもDeviceは大仰過ぎるのと、5系の環境下でうまく動かず四苦八苦していました。
そんなところで、SoceryとDoorkeeperに出会い、簡単に実装できました!
今度はWEBも実装する事になったので、セッション管理が必要だ~という事でSoceryとactiverecord-session_storeでログイン認証を実装する事になったのであります。
環境
- CentOS7
- ruby 2.4.3
- Rails 5.2.0
- MySQL 5.7
RoRとMySQLは導入済みの前提で話を進めます。
導入
いつもの様にGemfileを編集します。
Gemfileの編集
gem 'sorcery'
gem 'activerecord-session_store'
bundleインストール
コンソールからバンドル~Soceryとactiverecord-session_storeのインストール
bundle
rails generate sorcery:install
rails generate active_record:session_migration
migration fileの編集
Sorceryはデフォルトだとusersと言うテーブルのマイグレーションファイルになります。
しかしながら私が実装した環境では、usersはログイン認証以外の人情報を扱うテーブルとして既に存在していて、ログイン認証を同時に扱うには都合が悪かったのでsessionsというテーブルとして作成しました。
また、メールアドレスをログインIDとしない方式にしたのでlogin_idというcolumnでテーブルを作成しています。
class CreateSessions < ActiveRecord::Migration[5.2]
def change
create_table :sessions do |t|
t.string :login_id, null: false
t.string :crypted_password, null: false
t.string :salt, null: false
t.timestamps
end
end
end
activerecord-session_storeはデフォルトだとsessionsと言うテーブルのマイグレーションファイルになります。
しかしながらこちらについても、sessionsと言うテーブルは上記のSocery実装時に既にログイン認証(ID・パスワード管理)のためのテーブルとして存在していたので、session_storesという名称に変更しました。
class AddSessionStoresTable < ActiveRecord::Migration[5.2]
def change
create_table :session_stores do |t|
t.string :session_id, :null => false
t.text :data
t.timestamps
end
add_index :session_stores, :session_id, :unique => true
add_index :session_stores, :updated_at
end
end
マイグレーションを忘れずに。
rails db:migrate
Soceryの設定情報
デフォルトのログイン認証テーブル(:users)から変更になったことの宣言と、テーブルの変更について記述。
Rails.application.config.sorcery.submodules = []
Rails.application.config.sorcery.configure do |config|
config.user_config do |user|
user.username_attribute_names = :login_id
user.stretches = 1 if Rails.env.test?
end
config.user_class = 'Session'
end
activerecord-session_storeの設定情報
activerecord-session_storeを使用する事の宣言と、テーブル名称がデフォルト(:sessions)から変わった事を記述するファイルを作成。
セッションの有効期限を24時間に設定。
Rails.application.config.session_store :active_record_store, :key => '_app_session', :expire_after => 24.hour
ActiveRecord::SessionStore::Session.table_name = 'session_stores'
セッション
セッションの情報はこんな感じで取り出せたり。
p session[:login_id]
こんな感じにインポートできたりします。
session[:form_data] = params[:form_data]