Facebookアカウントを使って、OpenAMにサインインする

## 今日やること

今日はFacebookアカウントでOpenAMにサインインをしてみます。
わたしの場合、OpenAMの活用場所が従業員向けのIAMとなっているので、きっと使わない機能だとおもいます。完全に興味本位での検証です。

俗にいう**ソーシャルログイン**っていわれている機能ですが、仕組み自体はOpenID Connectと似たようなもんでしょう。たぶん。

## Facebook開発者になろう

FacebookからFederationしてもらうにあたり、当然ですがFacebookが提供しているエンドポイントをたたきます。まずは、たたくためのクライアント登録（Relying Partyの登録）を行います。

下記のURLにアクセスします

* https://developers.facebook.com/quickstarts/?platform=web

Facebookの認証画面が表示されるので、ログインします。

<img width="477" alt="001.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/df042894-244d-d07b-ac8f-8be6be22d0ea.jpeg">

サインイン後、ライセンスアグリーメントなどが表示されますが、最終的に以下のような画面が表示されます。

<img width="378" alt="003.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/513bfef6-7f73-05dc-6b9d-90030dce25d0.jpeg">

**設定 => ベーシック**からクライアント登録を行います。
おおよそ、以下のような感じで入力します。

* 表示名
    * Example IAM
* アプリドメイン
    * iam.example.com
* 連絡先メールアドレス
    * johnd@example.com
* サイトURL
    * https://iam.example.com:443/openam/XUI/ 

こんな感じです。

<img width="918" alt="006.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/7673eda6-85a0-e002-898a-2c57bf12aa7c.jpeg">

**アプリID**と**app secret**は`client id`と`client secret`に当たります。後ほど、OpenAM側に設定するので、控えておきましょう。また、**アプリドメイン**と**サイトURL**のドメイン部は一致している必要があります。

## ソーシャル連携設定

続いて、OpenAM側の設定をいれていきます。

管理者アカウント（ユーザー名は`amadmin`）でOpenAMにサインインします。

**Dashboard => Configure Social Authentication**をクリックします。

<img width="882" alt="007.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/84fac90d-e0eb-e041-cf61-ffd4c8721ef4.jpeg">

**Configure Facebook Authentication**をクリックします。

<img width="739" alt="008.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/a6ac9531-b981-16b5-e551-8e00f59e2fcf.jpeg">

ここで先ほどFacebook側で取得した`client id`と`client secret`を入力します。
（Facebook側で`client secret`は決められちゃうんだし、Confirmのフォームはいらない気がする...）

<img width="698" alt="009.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/993a41fd-4edf-c970-ba99-b8f6f791eba8.jpeg">

設定が完了すると、**チェーン**と**モジュール**、**サービス**を追加しといたよ！と表示が出ます。

<img width="569" alt="010.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/065fe013-da2f-3019-2cd7-9cba7294c488.jpeg">

## Facebookアカウントを使って、OpenAMにサインインする

それでは、確認していきましょう。
本連載でたてたRelying Party上に配置したphpinfo()を実行するコンテンツにアクセスします。（`https://rp.example.com/cgi-bin/phpinfo.php`）

サインイン画面が表示されますが、見た目が変わってます。下段のほうに**Facebookのアイコン**が表示されていますので、こちらをクリックします。

<img width="348" alt="011.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/46457dc8-8cd4-e789-ff5a-f8cde8b680bd.jpeg">

Facebookのログイン画面が表示されます。Facebookアカウントを使ってログインします。

<img width="481" alt="012.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/f3065415-8227-8ad7-c974-817230034ffc.jpeg">

ログインに成功すると、ユーザー属性の連携同意画面が表示されます。ここでの連携は**FacebookからOpenAMへの連携**です。いつもと逆なので注意していください。

<img width="460" alt="013.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/87f540f4-12ca-e0e0-a6a8-23b41a6186ca.jpeg">

続いて、**OpenAMからRelying Partyへのユーザー属性の連携**の同意画面が表示されます。Facebook上のユーザー情報が伝搬されていることが確認できます。

<img width="535" alt="014.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/3bdd2f02-0df2-85a7-4b2e-159bee709948.jpeg">

Federationが完了後、phpinfo()が実行され、連携されたユーザー属性情報が確認できます。注目すべきは`OIDC_CLAIM_SUB`の値です。OpenAMから連携される`sub(subject)`はOpenAM上における一意性のある文字列でしたが、ここでは**Facebook上における一意性のある文字列**となります。ただ、そういった情報をFederationするのは良しとしない風潮があるようで、実際はPPID(Pairwise Pseudonymous Identifier) なる仮名のようなものらしいです。へぇ～、何を危惧しているんだろう？Federationの向きと逆行したアイデンティティの紐づけを**許さんぞっ！**って感じですかね～？

<img width="556" alt="015.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/1b50e737-5556-2d43-2281-e491dbecdef1.jpeg">

## おまけ

ちなみに、今日の確認の手順では**OpenAM上に存在しない認証情報を使ってOpenAMに認証した**わけなんです。ただ、FacebookからOpenAMへのFederation時に、きちんとユーザーが作られていました。

```bash
$ sudo /home/openam/openam/opends/bin/ldapsearch -D "cn=Directory Manager" -w password -h localhost -p 50389 -b "ou=people,dc=openam,dc=forgerock,dc=org" uid=facebook-*
dn: uid=facebook-XXXXXXXXXXXXXXXX,ou=people,dc=openam,dc=forgerock,dc=org
objectClass: inetuser
objectClass: iplanet-am-managed-person
objectClass: kbaInfoContainer
objectClass: iplanet-am-auth-configuration-service
objectClass: devicePrintProfilesContainer
objectClass: sunFederationManagerDataStore
objectClass: inetorgperson
objectClass: forgerock-am-dashboard-service
objectClass: sunFMSAML2NameIdentifier
objectClass: sunIdentityServerLibertyPPService
objectClass: top
objectClass: iPlanetPreferences
objectClass: sunAMAuthAccountLockout
objectClass: pushDeviceProfilesContainer
objectClass: organizationalperson
objectClass: person
objectClass: iplanet-am-user-service
objectClass: oathDeviceProfilesContainer
mail: XXXXXX@XXXXXX.XXX
sn: XXXXXX
cn: XXXXXX XXXX
givenName: XXXX
userPassword: {SSHA}z8fTrMTp77PKCo7eqWRypqznuN+RrfxHsAZZZw==
uid: facebook-XXXXXXXXXXXXXXXX
inetUserStatus: Active
```

（パスワード情報はFederationしていないのに、つくられている...なんなんだこれは...(◞‸◟)）

## まとめ

* OpenAMにはソーシャルのアカウントと連携する機能がある
* 割と簡単に〇〇アカウントでログインが実装できる
* 今日はFacebookだけだったけど、MSアカウントとGoogleアカウント、~~野良~~その他のOpenID Providerとも連携できる

明日は何しよう～？

ばい！