SAML 認証を Ruby on Rails で試してみた
SAML 認証に触れる機会があったので、 Ruby on Rails で SAML 認証するサンプルアプリを作ってみた
折角なので、SAML とは何なのか?あたりからまとめてみようと思います。
SAML とは
まずは、SAML とは何なのか
- 読み方は サムル
- Security Assertion Markup Language の略
- 異なるサービス、アプリケーション間で認証情報を交換するための仕組み
- これによりシングルサインオン(1度のログインで、複数のアプリが利用可能になること) が実現できる
登場人物
Identity Provider
- 略称は IdP
- 実際の認証処理を行う人。認証したユーザの情報(ID、 メールアドレス等)を提供してくれる
Service Provider
- 略称は SP
- 認証情報を利用する人
今回は SP のサンプルを作成しました。
認証フロー
SAML の認証フローのイメージです。
- ユーザは SP に対してログインを試みる
- SP は Idp に対して認証リクエストを送信する
- IdP はユーザにログイン画面を表示する
- ユーザはログイン情報を入力する(ex. ID / Password)
- IdP は入力情報を検証し、正しければ SP に認証結果を送信
- SP は認証結果を検証し、正しければユーザをログインさせる
SAML の説明はこのあたりにして、サンプルアプリについて説明します
構成
IdP
サンプルアプリを動かすためには IdP が必要なので、今回は IdP に Azure Active Directory を利用しました。
SP
SP は以下の技術要素で作成
- Ruby 2.3.3
- Ruby on Rails 5.0.1
また、SAML のライブラリとして ruby-saml を使用しました。
サンプルアプリ
サンプルアプリはメモ管理アプリとなっています。
Azure AD で認証したユーザのメモ一覧・登録・更新・削除ができる簡単なものです。
SAML 連携部分の実装は https://github.com/onelogin/ruby-saml のサンプル https://github.com/onelogin/ruby-saml-example をベースに
少し修正を入れたものになっています。
(SAML 部分の実装はほぼサンプルのままです)
動作確認
http://localhost:3000 にアクセス
「Azure AD で Login」をクリック
Microsoft アカウント(IdP)のログインページが表示される
ID / Password を入力
メモアプリ(SP)にログインする
まとめ
SP を作るためにはもっとゴリゴリ書く必要があるかと思っていたのですが、
https://github.com/onelogin/ruby-saml がとても使いやすく、IdP の設定情報を記述するだけで動かすことができました。サンプルもあるのも良かったです。