今日やること
これまでは、OpenAMからのフェデレーション(認証情報と属性情報の連携)の受け側はPolicy Agentがやってくれました。
ここから数回は流行りのOpenID Connectを使ってフェデレーションを試してみたいなぁと思います。
OpenID Connectってなに?
OpenID Connectについて語る記事でも無ければ、多くを語るほどの知識がわたしには無いので、勉強するのにむっちゃ役に立ったサイトを参照します。
公開資料 | OpenID Foundation Japan
入門スライドからRFCの日本語訳までいろいろ載ってます。すごい(小並感
(都会には勉強の機会があっていいなぁ~(◞‸◟))
今のところのわたしの理解を3行でまとめると、
- Federation(ID連携)という分野の技術で、RFCにもなってる
- 「この人(こんな)認証に成功したよ」って情報と「認証成功した人の属性」情報を連携する
- OAuth 2.0のシーケンスで前述のID連携をする
ってぐらいです。なんだか仕様は多いように感じるのですが、Policy Agentでやっていたようなこと(シングルサインオンとプロフィール情報の連携)がしたいだけなので、とりあえずそれを目指してやっていきます。
OpenAMをOpenID Providerにする
それでは設定します。
OpenAMの管理者アカウント(ユーザー名はamadmin
)でOpenAMの管理コンソールにサインインします。
Dashboard => Configure OAuth Providerをクリックします。
続いて、Configure OpenID Connectをクリックします。
古臭いUIが表示されます。いろいろ設定値がありますが、何も考えずに右上の作成をクリックします。
参考までに、設定項目について簡単に説明しますと、
- リフレッシュトークンの有効期間
- リフレッシュトークンっていうアクセストークンを再取得するときに使うトークンの有効期限
- 認可コードの有効期間
- ID連携をバックチャネルで行うときにフロントチャネル側に出回るトークンの有効期限
- 基本的に短命で1回しか使えない
- アクセストークンの有効期間(秒):
- 認証したユーザーの属性情報を取得するときに使うトークンの有効期限
- リフレッシュトークンの発行
- そもそもリフレッシュトークンを発行するのか?って設定
- Issue Refresh Tokens on Refreshing Access Tokens
- アクセストークンを再取得した時にリフレッシュトークンを再生成するかどうかの設定
って感じかなっ!!?(たぶん)
作成が完了すると、Services => OAuth2 プロバイダという項目が出来上がっています。アクセスすると以下のような感じです。
動作確認
OpenAMをOpenID Providerに設定した時点で、いろいろなエンドポイントが有効化されています。手っ取り早く確認するには、/openam/oauth2/.well-known/openid-connect
というエンドポイントにGET
リクエストを送ります。
$ 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はID連携のための仕様
- OpenAMは1分でOpenID Providerになれる
- OpenID Providerの設定情報を展開するエンドポイントがある
ってとこです。
あしたはApacheをRelying Party化して、シングルサインオンと属性連携みたいなことをしてみる。
ばい!