SSO を実現するための SAML2.0 の実装。まずはサンプルを動かす

シングルサインオンに対応するために SAML2.0 に対応する場合もあると思います。

SAML2.0 に対応すると

* [OneLogin](https://www.onelogin.com/jp)
* [okta](https://www.okta.com/)

といったアイデンティティー管理をクラウドで提供しているサービスと連携ができるようになります。

SAML2.0 は、OneLogin提供の [ruby-saml](https://github.com/onelogin/ruby-saml) を利用すると簡単に実装することができます。

まずはサンプルを動かすところを実施したいと思います。

## OneLogin - アカウント作成

サイトの内容に従って、アカウントを作りましょう。


## OneLogin - Connector の追加

メニュー > APPS > Add Apps
![スクリーンショット 2015-10-07 19.47.48.png](https://qiita-image-store.s3.amazonaws.com/0/53620/349c5389-c237-02c6-d6bc-f71725d17647.png)

「SAML Test Connector」で検索し「SAML Test Connector(IdP)」をクリックします。
![スクリーンショット 2015-10-07 19.49.03.png](https://qiita-image-store.s3.amazonaws.com/0/53620/6331f0dd-3162-df33-929f-2469264dcdca.png)

「SAVE」をクリックします。変更しても変更しなくてもどちらもで良いです。
![スクリーンショット 2015-10-07 19.52.38.png](https://qiita-image-store.s3.amazonaws.com/0/53620/6d56331f-afee-7fec-6949-c8b8d18cfbd9.png)

Coniguration タブを選択し以下を入力し「SAVE」します。

| 変更箇所 | 値の取得場所
|:-- |:-- |
| Audience | http://localhost:3000/saml/metadata |
| Recipient | http://localhost:3000/saml/acs |
| ACS URL Validator | ^http:¥/¥/localhost:3000¥/saml¥/acs$ |
| ACS URL | http://localhost:3000/saml/acs |

![スクリーンショット 2015-10-07 19.55.35.png](https://qiita-image-store.s3.amazonaws.com/0/53620/564e786e-8318-6aba-a5d4-670e152b7973.png)


## ruby-saml-example - 取得

https://github.com/onelogin/ruby-saml-example

にサンプルがあるので clone して bundle install します。

```
git clone https://github.com/onelogin/ruby-saml-example.git
cd ruby-saml-example
bundle install
```

## ruby-saml-example - 修正

![スクリーンショット 2015-10-07 19.59.18.png](https://qiita-image-store.s3.amazonaws.com/0/53620/f69fe4f8-47ef-12f4-8783-24c565853180.png)

上記の OneLogin Connector SSOタブに表示されている情報をもとに以下の箇所を修正します。

| 変更箇所 | 値の取得場所
|:-- |:-- |
| ＜onelogin-app-id＞部分 | Issuer URL の最後に書かれている数値部分 |
| settings.idp_cert の値 | 上記の View Detail で表示される X.509 Certificate |
 

```rb:ruby-saml-example/app/models/account.rb
    # IdP section
    settings.idp_entity_id                  = "https://app.onelogin.com/saml/metadata/<onelogin-app-id>"
    settings.idp_sso_target_url             = "https://app.onelogin.com/trust/saml2/http-post/sso/<onelogin-app-id>"
    settings.idp_slo_target_url             = "https://app.onelogin.com/trust/saml2/http-redirect/slo/<onelogin-app-id>"
    settings.idp_cert                       = "-----BEGIN CERTIFICATE-----
MIICbjCCAdegAwIBAgIBADANBgkqhkiG9w0BAQ0FADBUMQswCQYDVQQGEwJ1czET
MBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UECgwMT25lbG9naW4gSW5jMRkwFwYD
VQQDDBBhcHAub25lbG9naW4uY29tMB4XDTE0MDkxMTE1MDUxMVoXDTE1MDkxMTE1
MDUxMVowVDELMAkGA1UEBhMCdXMxEzARBgNVBAgMCkNhbGlmb3JuaWExFTATBgNV
BAoMDE9uZWxvZ2luIEluYzEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbTCBnzAN
BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsezUGLSiNMXg80EZMMzvXH43f07a1plU
mm1poYvVfgSICTqhEUuA0x4w9w/K4BegO07GVkUjNCrvtJEqq4FMDbHj2VfOCMHx
lYi52/ELXKe6ALSm48y5BG9fd1kGHBqBg741KpMvDkmAbX1sLq5reAjOccIDme2d
lLD8tQ8y0IMCAwEAAaNQME4wHQYDVR0OBBYEFP3cLGEyby7TBXweK0SeFrvnRoHL
MB8GA1UdIwQYMBaAFP3cLGEyby7TBXweK0SeFrvnRoHLMAwGA1UdEwQFMAMBAf8w
DQYJKoZIhvcNAQENBQADgYEAS3vJKRFGjvxOHHNJR77wYlxSSbyb9vmWOVBzaTMd
5TFfoSDxuP9RskRjSrez/63WON6tdYr/mJNSNB70ZAic824Y9feQ/kBaCswI+Pgp
b6sFIh4CrY4yCEkBPD8jXFCeJMq+2AqshbITpiu7WF1RCAp/sRAO56giP/B4l0o0
Tc0=
-----END CERTIFICATE-----"
```

## ruby-saml-example - 動作確認

Rails を立ち上げます。

```
bundle exec rails server -b 0.0.0.0
```

http://localhost:3000/ を表示し「Login」リンクをクリックすると、OneLogin を IdP とした SAML2.0認証（シングルサインオン）を試せます。

## まとめ

OneLogin が Gem を提供してくれているおかげで簡単に SAML2.0 のSP（クライアント）を実装することができます。

SAML2.0 のSPを実装している Gem なので OneLogin 以外の SAML2.0に対応しているアイデンティティー管理サービスと連携することができます。

サンプルもすごくシンプルで以下の２ファイルをみると ruby-saml の使い方がわかります。

* app/controllers/saml_controller.rb
* app/models/account.rb

いろいろなシングルサインオンを実現するプロトコルがあると思いますが、SAML2.0 も候補の１つになると思います。