Himawari Project Logo

Himawari Project

Rails7でMicrosoft Entra IDを使ったログインを実装する

Rails7でMicrosoft Entra IDを使ったログインを実装する

6/21/2024

#Ruby on Rails7#EntraID

今回は、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 ポータルでアプリケーションを登録する

  1. Azure ポータルにサインインし、「Azure Entra ID」に移動します。

  2. 「アプリの登録」をクリックし、新しい登録を作成します。

  3. 新規登録をクリックします

  4. 必要な情報を入力し、リダイレクト URI としてhttp://localhost:3000/users/auth/azure_activedirectory_v2/callback を追加します。

  5. 「証明書とシークレット」セクションで、新しいクライアントシークレットを作成します。このシークレットは後で使います。






  6. .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