SSO for HerokuでSalesforceからHerokuにログイン

SSO for HerokuがPublic Bataになりました。Enterprise限定の機能です。
SalesforceやGoogle Appsのユーザ情報を使ってHerokuにログインできるようになるやつです。
<https://blog.heroku.com/archives/2015/12/17/SSO-for-Heroku>

早速これをつかってSalesforceからHerokuにログインできるようにしてみようと思います。

必要なもの

- Heroku Enterprise契約（Heroku Organization）
- Heroku OrganizationのAdminロール（多分）
- Salesforceのシステム管理者

注意点

- パスワードでログインできなくなります（toolbeltは`heroku login --sso`でログインします）
- メールアドレスを変更できなくなります
- SSOを解除する方法がありません（OrganizationのSSO設定ごと解除することはできます）
- Manage Account→Applicationsが使えなくなります（OAuthのやつ）
- API Keyが使えなくなります
- SSH Keyを追加できなくなります（[HTTP git](https://devcenter.heroku.com/articles/git#http-git-authentication)を使えと書いてあります）
- Herokuのアカウントを削除できなくなります

SSOを解除できない、メールアドレスを変更できないあたり、会社専用のアカウントに使うための機能のようです。

OAuth使えなくなるの大丈夫かな？と思いますが使ってないのでよくわかりません。
SSH Keyが使えなくなるのは困ります。HTTP gitが使えないとCIからデプロイできません。

Herokuサービスプロバイダ情報を確認
----
Herokuダッシュボードから、自分のOrganization→Settingsを開きます。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/d9509c7b-3ac9-fe5f-53bb-3a9278b96df4.png)

後からここの情報をコピペすることになります。

Salesforceの設定
----
### マイドメインのリリース

SalesforceをIDプロバイダにするにはマイドメインをリリースする必要があります。
マイドメインの設定は一度しかできません。設定すると変更できなくなります。

設定→管理→ドメイン管理→私のドメインを開きます。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/fdd4caf6-e1b5-c67f-5749-e93150ff65b5.png)

任意のドメインを入力し、使用可能か調べる→同意チェック→ドメインの登録とします。
しばらくの間は「貴社のドメイン名登録は未認証です」と表示されていますが、10分ぐらい経ってリロードすると「テスト可能です」になります。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/f1e4590f-6e00-7fc0-a17b-0d0d370238ed.png)

こちらをクリックしてログインしてください→ユーザにリリースと操作するとマイドメインが利用可能になります。

### 接続アプリケーションの作成

Herokuのサービスプロバイダ情報を設定する手順です。設定→ビルド→作成→アプリケーションを開き、接続アプリケーションを新規作成し、以下のように入力して保存します。

- **接続アプリケーション名**: 画面に表示されます。なんでもいいです。Herokuとか
- **API参照名**: なんでもいいです。Herokuとか
- **取引責任者メール**: 連絡先メールアドレスの意味です。なんでもいいです
- **ロゴ画像URL**: アプリケーションランチャーに表示されるロゴ画像です。幅が最大200px、高さが最大125pxとかなり小さい画像しか使えません。なんでもいいですが <http://heroku.com/brand> から探してリサイズしたものを使いました。
- **SAMLの有効化**にチェック。これをチェックしないとここから下の設定は表示されません
- **開始URL**: Herokuのサービスプロバイダ情報から **Heroku Login URL (Start URL)** をコピペします
- **エンティティID**: Herokuのサービスプロバイダ情報から **Heroku Entity ID** をコピペします
- **ACS URL**: Herokuのサービスプロバイダ情報から **ACS URL** をコピペします
- **件名種別**: HerokuのID(メールアドレス)に対応するSalesforceのUserオブジェクトの項目を選びます
    - ユーザ名がメールアドレスになっていればユーザ名でいいです
    - 違うならユーザオブジェクトにメールアドレスを設定するカスタム項目（数式でもよさ気）を作成し、カスタム属性→メールアドレスを設定する項目と選びます。標準のEmail項目が選べればいいのに…
    - 他にSSOしているサービスがないなら統合ID（FederationIdentifier項目。512文字）を使ってもいいですが、レイアウトに表示することができないのでSalesforceの管理者がAPIなどで設定する必要があります
    - 永続IDはよく知らないのですが、アルゴリズムで計算されるものらしいので使えないと思います。多分SAMLのPersistent Pseudonym Identifierのことです
- **名前ID形式**: Herokuのサービスプロバイダ情報の **Name-id Format** と同じものを選択します。最後がemailAddressになってるやつです

![](https://qiita-image-store.s3.amazonaws.com/0/21374/596e56ae-b4f3-e700-abe9-ca975dd524ce.png)

### 接続アプリケーションの権限設定

接続アプリケーションを保存し、詳細レイアウトのManageボタンから接続アプリケーションの管理に移動します。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/56a88acd-cf5c-96db-2bd0-df9a3bfdd46f.png)

下の方にあるプロファイル関連リストのプロファイルを管理するボタンから、SSOを許可するプロファイルを追加します。権限セットで設定することもできます。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/7a49f42e-c25d-0e2f-ddd5-9b5042ab2ff1.png)

ここまで設定すると、アプリケーションスイッチャやアプリケーションランチャーからこのアプリを選べるようになります。システム管理者でもプロファイルを追加しないと利用できません。

Herokuの設定
----
### SAMLメタデータのダウンロード
まだSalesforceです。さっきの接続アプリケーションの管理を開きます。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/9468ac3e-c475-8f14-f751-69b13099a1ea.png)

SAMLログイン情報セクションのメタデータのダウンロードボタンからメタデータをダウンロードします。`SAMLIdP-aqwsedrftgyhujik.xml`というようなファイル名でダウンロードされるはずです。

### SAMLメタデータのアップロード

Herokuダッシュボードから、自分のOrganization→Settings（最初の画面）を開き、Upload Metadataでさっきダウンロードした`SAMLIdP-aqwsedrftgyhujik.xml`をアップロードします。これでシングルサインオンできるようになります。

なお複数のIDプロバイダを設定することはできないようです。

### SSOの解除

Herokuダッシュボードから、自分のOrganization→Settingsを開き、Disableボタンで解除することができます。
ユーザ単位で解除する方法はありません。

シングルサインオン
----
### Salesforceから（IdP initiated）

Salesforceにログイン済みなら、Salesforceのアプリケーションスイッチャ（ランチャー）からログインするのが簡単でしょう。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/17ecf10f-6226-d78b-5937-3cf6f127c586.png)

### Herokuから（SP initiated）

Herokuのログイン画面の下の方にこそっとLogin via SSOというリンクができているのでそこからログインすることもできます。 こっちの場合は最初にHeroku Organization名を入力することになります。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/457f4fcf-2f3b-6249-26a4-7cde1cfcd8ea.png)

### SSOの有効化

SSOでログインした時、Salesforceが持っているHerokuのID（メールアドレス）に該当するユーザがいる場合、最初にアカウントの確認を求められます。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/ee2b00ec-f45f-621f-9b84-1407ecaea5d4.png)

Verify my Accountボタンから普通にHerokuにログインすると、「メールアドレスとパスワードではログインできなくなりますよ」といった注意事項が表示されます。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/507a2517-576b-792e-542d-a8690442d2da.png)

Upgrade my AccountをクリックするとSSOできるようになります。
なおSSOログインした時該当するHerokuユーザがいなければ、自動的に新規ユーザでサインアップされます。ジャストインタイムプロビジョニングと言うらしいです。

### Heroku Toolbelt

SSOするとHeroku Toolbeltがログアウトさせられるので、`heroku login --sso`でログインしなおします。
コマンドを入力するとHeroku Organization名を聞かれます。その後ブラウザが開き、Access Tokenが表示されるのでコピペします。後はこれまでどおり利用できるはずです。

どうもこのAccess TokenはAPI Keyのように利用できるようですが、（短時間しか試してませんが）毎回同じトークンになります。API Keyの再発行に相当する機能が見当たりません。どうやるんだろう。

注意事項
----
### パスワードでログインできなくなる

SSOを有効化するとパスワードでログインできなくなります。Toolbeltは`heroku login --sso`でログインします。

SSOするとパスワードが無効化されるので、OrganizationのSSOが無効化された場合、パスワードをリセットする必要があります。
Heroku Organizationを抜けてもSSO経由でしかログインできないままです。パスワードでログインできるようにはなりません。SSO経由でログインするとまたOrganizationのメンバーに戻ります。

### メールアドレスを変更できなくなる

会社の仕事専用のHerokuアカウントで使う想定なのだと思います。会社を辞めてメールアドレスやSSOのIDプロバイダが使えなくなったらどうしようもありません。
仕事と関係ないPersonal appをそのアカウントで作っていた、というような場合は、会社の管理者に頼んでTransfer Ownershipしてもらうくらいしかないでしょう。

### SSOを解除する方法がない

一度SSOすると解除する方法がありません。OrganizationのSSO設定ごと解除するしかありません。
Heroku Organizationを抜けてもSSO経由でしかログインできないままです。パスワードでログインできるようにはなりません。SSO経由でログインするとまたOrganizationのメンバーに戻ります。

ちなみにSSOするとパスワードが無効化されるので、OrganizationのSSOが無効化された場合、パスワードをリセットする必要があります。

### Manage Account→Applicationsが使えなくなる

OAuthのやつです。使ってないのでどのくらい影響があるかよくわかりません。

### API Keyが使えなくなる

CIからアクセスするのが大変なので困り者です。`heroku login --sso`のAccess TokenをAPI Keyの代わりに利用できるようですが、SSH Keyも追加できなくなるのでHTTP gitに対応していないCIだとデプロイできません。
ところでこのAccess Token、（短時間しか試してませんが）毎回同じトークンになります。API Keyの再発行に相当する機能が見当たりません。どうやるんだろう。

SSOした時点でAPI Keyが無効化されるようです。OrganizationのSSOが無効化された場合、新しいAPI Keyが発行されます。

### SSH Keyを追加できなくなる

これまで登録していたSSH Keyは引き続き利用できるようです。削除することもできないのは問題のような…
gitは[HTTP git](https://devcenter.heroku.com/articles/git#http-git-authentication)を使うようにと書いてあります。

### Herokuのアカウントを削除できなくなる

これは困ることはないのでは。

参考リンク
----
- <https://blog.heroku.com/archives/2015/12/17/SSO-for-Heroku> ブログでのアナウンス
- <https://devcenter.heroku.com/articles/sso-for-heroku> 公式リファレンス
- <https://devcenter.heroku.com/articles/using-sso-services-with-heroku> SSOの設定方法Heroku側
- <https://devcenter.heroku.com/articles/using-salesforce-identity-sso-with-heroku> SSOの設定方法Salesforce側
- <https://devcenter.heroku.com/articles/using-single-sign-on-sso-services-with-heroku-for-end-users> ユーザガイド