読者です 読者をやめる 読者になる 読者になる

mmts1007’s diary

プログラミング関連の技術系ブログです。

SAML 認証を Ruby on Rails で試してみた

SAML 認証に触れる機会があったので、 Ruby on RailsSAML 認証するサンプルアプリを作ってみた
折角なので、SAML とは何なのか?あたりからまとめてみようと思います。

SAML とは

まずは、SAML とは何なのか

  • 読み方は サムル
  • Security Assertion Markup Language の略
  • 異なるサービス、アプリケーション間で認証情報を交換するための仕組み
    • これによりシングルサインオン(1度のログインで、複数のアプリが利用可能になること) が実現できる

登場人物

Identity Provider

  • 略称は IdP
  • 実際の認証処理を行う人。認証したユーザの情報(ID、 メールアドレス等)を提供してくれる

Service Provider

  • 略称は SP
  • 認証情報を利用する人

今回は SP のサンプルを作成しました。

認証フロー

SAML の認証フローのイメージです。 f:id:mmts1007:20170121235429p:plain

  1. ユーザは SP に対してログインを試みる
  2. SP は Idp に対して認証リクエストを送信する
  3. IdP はユーザにログイン画面を表示する
  4. ユーザはログイン情報を入力する(ex. ID / Password)
  5. IdP は入力情報を検証し、正しければ SP に認証結果を送信
  6. SP は認証結果を検証し、正しければユーザをログインさせる


SAML の説明はこのあたりにして、サンプルアプリについて説明します

構成

IdP

サンプルアプリを動かすためには IdP が必要なので、今回は IdP に Azure Active Directory を利用しました。

azure.microsoft.com

SP

SP は以下の技術要素で作成

また、SAML のライブラリとして ruby-saml を使用しました。

github.com

サンプルアプリ

サンプルアプリはメモ管理アプリとなっています。
Azure AD で認証したユーザのメモ一覧・登録・更新・削除ができる簡単なものです。

SAML 連携部分の実装は https://github.com/onelogin/ruby-saml のサンプル https://github.com/onelogin/ruby-saml-example をベースに
少し修正を入れたものになっています。
(SAML 部分の実装はほぼサンプルのままです)

github.com

動作確認

http://localhost:3000 にアクセス
「Azure AD で Login」をクリック f:id:mmts1007:20170122020523p:plain

Microsoft アカウント(IdP)のログインページが表示される
ID / Password を入力 f:id:mmts1007:20170122020841p:plain

メモアプリ(SP)にログインする f:id:mmts1007:20170122020539p:plain

まとめ

SP を作るためにはもっとゴリゴリ書く必要があるかと思っていたのですが、
https://github.com/onelogin/ruby-saml がとても使いやすく、IdP の設定情報を記述するだけで動かすことができました。サンプルもあるのも良かったです。