OpenAMをOpenID Providerにする

## 今日やること

これまでは、OpenAMからのフェデレーション（認証情報と属性情報の連携）の受け側はPolicy Agentがやってくれました。

![001-a.jpg](https://qiita-image-store.s3.amazonaws.com/0/148404/1907db62-a1ca-31e3-cb2a-3bb331a714b0.jpeg)

ここから数回は**流行りのOpenID Connect**を使ってフェデレーションを試してみたいなぁと思います。

![001-b.jpg](https://qiita-image-store.s3.amazonaws.com/0/148404/3ee79fcc-ff88-162b-e0f0-b4b392ca9a97.jpeg)

## OpenID Connectってなに？

OpenID Connectについて語る記事でも無ければ、多くを語るほどの知識がわたしには無いので、勉強するのにむっちゃ役に立ったサイトを参照します。

[公開資料 | OpenID Foundation Japan](http://www.openid.or.jp/document/)

入門スライドからRFCの日本語訳までいろいろ載ってます。すごい（小並感
（都会には勉強の機会があっていいなぁ～(◞‸◟)）

今のところのわたしの理解を3行でまとめると、

1. Federation（ID連携）という分野の技術で、RFCにもなってる
2. 「この人（こんな）認証に成功したよ」って情報と「認証成功した人の属性」情報を連携する
3. OAuth 2.0のシーケンスで前述のID連携をする

ってぐらいです。なんだか仕様は多いように感じるのですが、Policy Agentでやっていたようなこと（シングルサインオンとプロフィール情報の連携）がしたいだけなので、とりあえずそれを目指してやっていきます。

## OpenAMをOpenID Providerにする

それでは設定します。

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

**Dashboard => Configure OAuth Provider**をクリックします。

<img width="696" alt="002.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/201d0541-23ec-47f5-2f4d-a59574db1bca.jpeg">

続いて、**Configure OpenID Connect**をクリックします。

<img width="735" alt="003.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/fb640887-4a98-e1fb-eaa6-1500f56aa787.jpeg">

**古臭いUI**が表示されます。いろいろ設定値がありますが、何も考えずに右上の**作成**をクリックします。

<img width="1063" alt="004.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/a4900762-a93a-a6e7-8839-8f5146eb28d6.jpeg">

参考までに、設定項目について簡単に説明しますと、

* リフレッシュトークンの有効期間
    - リフレッシュトークンっていうアクセストークンを再取得するときに使うトークンの有効期限
* 認可コードの有効期間
    - ID連携をバックチャネルで行うときにフロントチャネル側に出回るトークンの有効期限
    - 基本的に短命で1回しか使えない
* アクセストークンの有効期間(秒):
    - 認証したユーザーの属性情報を取得するときに使うトークンの有効期限
* リフレッシュトークンの発行
    - そもそもリフレッシュトークンを発行するのか？って設定
* Issue Refresh Tokens on Refreshing Access Tokens
    - アクセストークンを再取得した時にリフレッシュトークンを再生成するかどうかの設定

って感じかなっ！！？（たぶん）

作成が完了すると、**Services => OAuth2 プロバイダ**という項目が出来上がっています。アクセスすると以下のような感じです。

<img width="888" alt="005.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/13f0355c-ffec-0890-1469-d565e1881543.jpeg">

## 動作確認

OpenAMをOpenID Providerに設定した時点で、いろいろなエンドポイントが有効化されています。手っ取り早く確認するには、`/openam/oauth2/.well-known/openid-connect`というエンドポイントに`GET`リクエストを送ります。

```json
$ curl -k https://iam.example.com/openam/oauth2/.well-known/openid-configuration
{
   "response_types_supported":[
      "code token id_token",
      "code",
      "code id_token",
      "id_token",
      "code token",
      "token",
      "token id_token"
   ],
   "claims_parameter_supported":false,
   "end_session_endpoint":"https://iam.example.com:443/openam/oauth2/connect/endSession",
   "version":"3.0",
   "check_session_iframe":"https://iam.example.com:443/openam/oauth2/connect/checkSession",
   "scopes_supported":[
      "address",
      "phone",
      "openid",
      "profile",
      "email"
   ],
   "issuer":"https://iam.example.com:443/openam/oauth2",
   "id_token_encryption_enc_values_supported":[
      "A256GCM",
      "A192GCM",
      "A128GCM",
      "A128CBC-HS256",
      "A192CBC-HS384",
      "A256CBC-HS512"
   ],
   "acr_values_supported":[

   ],
   "authorization_endpoint":"https://iam.example.com:443/openam/oauth2/authorize",
   "userinfo_endpoint":"https://iam.example.com:443/openam/oauth2/userinfo",
   "claims_supported":[
      "zoneinfo",
      "address",
      "profile",
      "name",
      "phone_number",
      "given_name",
      "locale",
      "family_name",
      "email"
   ],
   "id_token_encryption_alg_values_supported":[
      "RSA-OAEP",
      "RSA-OAEP-256",
      "A128KW",
      "RSA1_5",
      "A256KW",
      "dir",
      "A192KW"
   ],
   "jwks_uri":"https://iam.example.com:443/openam/oauth2/connect/jwk_uri",
   "subject_types_supported":[
      "public"
   ],
   "id_token_signing_alg_values_supported":[
      "ES384",
      "HS256",
      "HS512",
      "ES256",
      "RS256",
      "HS384",
      "ES512"
   ],
   "registration_endpoint":"https://iam.example.com:443/openam/oauth2/connect/register",
   "token_endpoint_auth_methods_supported":[
      "client_secret_post",
      "private_key_jwt",
      "client_secret_basic"
   ],
   "token_endpoint":"https://iam.example.com:443/openam/oauth2/access_token"
}
```

`/openam/.well-known/openid-configuration`には、OpenID Providerの設定情報が展開されており、また、きちんと仕様が決まっています。何が書かれているか知りたい場合は、以下のリンクをご参照ください。
ID連携の受け側（Relying Party）はこの情報を参照しながら動作するように実装すると色んなOpenID ProviderとID連携できそうですね。

* [OpenID Connect Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig)

## いったん〆

今日はあんまり時間取れませんでした。すみません。
今日のまとめですが、

* OpenID ConnectはID連携のための仕様
* OpenAMは1分でOpenID Providerになれる
* OpenID Providerの設定情報を展開するエンドポイントがある

ってとこです。

あしたはApacheをRelying Party化して、シングルサインオンと属性連携みたいなことをしてみる。

ばい！