
Rails7でMicrosoft Entra IDを使ったログインを実装する
6/21/2024
今回は、Ruby on Rails の Devise を使って、Microsoft Entra ID でログインできるようにします。
前提
条件
-
Azure アカウントを作成済みである
-
Azure Portal へログインできる
環境
-
ruby 3.3.1
-
Rails 7.1.3.4
Microsoft Entra ID(旧 Azure AD)とは?
クラウドベースの ID 管理とアクセス管理のサービスを提供します。(Microsoft 認定資格試験テキスト AZ900:Micosoft Azure Fundamentals 改訂第2版 須屋聡史/富岡洋/佐藤雅信)
今回は、認証・認可サーバを Entra ID に担わせて Rails 側でその情報を受け取る実装にしていきます。
プロジェクトの作成
-
プロジェクトの作成をします
$ rails new entraid
(entraid)は適当で OK -
$ cd entraid
でプロジェクトフォルダに移動します
Gem の追加
Gemfile に必要な Gem を追加します
Gemfile
gem 'devise'
gem "omniauth"
gem "omniauth-rails_csrf_protection"
gem 'omniauth-azure-activedirectory-v2'
gem 'dotenv-rails', groups: [:development, :test]
$ bundle install
を実行します
Devise のセットアップ
Devise をセットアップします
$ rails generate devise:install
$ rails generate devise User
$ rails db:migrate
Omniauth の設定を追加する
config/initializers/devise.rb ファイルに、Azure AD の設定を追加します。
config/initializers/devise.rb
Devise.setup do |config|
# 他の設定
config.omniauth :azure_activedirectory_v2,
client_id: ENV['AZURE_CLIENT_ID'],
client_secret: ENV['AZURE_CLIENT_SECRET'],
tenant_id: ENV['AZURE_TENANT_ID']
end
User モデルに Omniauth の設定を追加する
app/models/user.rb ファイルに以下を追加します。
app/models/user.rb
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable, :omniauthable, omniauth_providers: [:azure_activedirectory_v2]
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0, 20]
# ユーザーの追加情報を必要に応じて設定
end
end
end
コントローラに Omniauth のコールバックを追加する
app/controllers/users/omniauth_callbacks_controller.rb ファイルを作成し、以下を追加します。
app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def azure_activedirectory_v2
@user = User.from_omniauth(request.env["omniauth.auth"])
if @user.persisted?
sign_in_and_redirect @user, event: :authentication
set_flash_message(:notice, :success, kind: "Azure") if is_navigational_format?
else
session["devise.azure_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
def failure
redirect_to root_path
end
end
ルーティングの設定をする
config/routes.rb ファイルに以下を追記します。
config/routes.rb
Rails.application.routes.draw do
devise_for :users, controllers: {
omniauth_callbacks: 'users/omniauth_callbacks'
}
# 他のルート
# ルートパスの設定
root to: 'home#index'
end
ホームページの作成
ホームページのコントローラとアクションを作成します。
bash
$ rails generate controller home index
これで、app/controllers/home_controller.rb と app/views/home/index.html.erb が作成されます。
ビューをカスタマイズする
ログインボタンを追加するために、ビューをカスタマイズします。例えば、app/views/devise/sessions/new.html.erb に以下を追加します。
app/views/devise/sessions/new.html.erb
<h2>Log in</h2>
<%= render "devise/shared/links" %>
Azure ポータルでアプリケーションを登録する
-
必要な情報を入力し、リダイレクト URI としてhttp://localhost:3000/users/auth/azure_activedirectory_v2/callback を追加します。
-
.env ファイルを作成します。
AZURE_CLIENT_ID,AZURE_TENANT_ID は、以下の画像の欄からコピーします。
AZURE_CLIENT_SEACRET は手順5で取得したシークレット値を利用します。
.env
AZURE_CLIENT_ID=your_client_id
AZURE_CLIENT_SECRET=your_client_secret
AZURE_TENANT_ID=your_tenant_id
7.Rails を再起動します。
bash
$ rails s