3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ひとり OpenAMAdvent Calendar 2016

Day 12

OpenAMから連携できるユーザー属性を追加する

Posted at

ユーザーの属性情報の連携

昨日はApacheにmod_auth_openidcというApacheをRelying Partyとして動作させるモジュールを導入し、実際にFederationをやってみました。このとき要求した情報の範囲(scope)はopenidprofileでした。

以下は、実際にOpenID Providerから連携した情報(profile)になります。

001.JPG

上述のように、profileっていうscopeを要求した時は、**「Full nameFamily nameGiven nameを連携するよ~?」**っていう同意画面が表示され、実際にRelying Partyに連携されます。

ただ、会社のアプリケーションを動作させるには、他にも欲しい情報があったりします。例えば、

  • 所属
  • 役職
  • 権限グループ(AD上のSecurity Groupの情報)

こういった情報が認証時に連携される前提があれば、業務アプリケーションを作るのが(主に権限まわり)が捗ると思いませんか?きっと捗るはず!^^なので、今日は連携するユーザーの属性情報を増やしてみましょう。

会社っぽい属性を持ったユーザーを追加

今日はこれまで使っていた検証用アカウント(ユーザー名はjohnd)は使わずに、新たに会社っぽいユーザー属性を持ったユーザーを追加して、そのユーザーの属性を連携するという方針で行きます。

まず、以下のLDIF(ファイル名はsample.ldif)を作成します。構成はシンプルです。

  • INFOSYS01って組織がある
  • gnanashiってユーザーがいる
  • gnanashiINFOSYS01に所属している
  • gnanashiManagerである
dn: cn=INFOSYS01,ou=groups,dc=openam,dc=forgerock,dc=org
changetype: add
objectClass: groupofuniquenames
objectClass: top
cn: INFOSYS01
uniqueMember: uid=nanashi,ou=people,dc=openam,dc=forgerock,dc=org

dn: uid=gnanashi,ou=people,dc=openam,dc=forgerock,dc=org
changetype: add
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
cn: gonbei nanashi
sn: nanashi
givenName: gonbei
memberOf: cn=INFOSYS01,ou=groups,dc=openam,dc=forgerock,dc=org
title: Manager
departmentNumber: INFOSYS01
inetUserStatus: Active
uid: gnanashi
userPassword: password

OpenAMがインストールされたサーバーにはldap某系のコマンドが配置されますので、その中のldapmodifyコマンドを使って、作成したLDIFでユーザーとグループを作成します。

$ sudo /home/openam/openam/opends/bin/ldapmodify -D "cn=Directory Manager" -w password -h localhost -p 50389 -f ~/sample.ldif

追加したユーザーの属性をOpenAMの検索対象に加える

本連載で用意しているOpenAMのユーザーリポジトリは内蔵(embedded)のLDAPを使用しています。この場合、OpenAMはあらかじめ設定されたユーザーの属性しか検索対象に加えない構成となっています。よって、明示的にdepartmentNumbertitleを検索対象としてやる必要があります。

Top Realm Level => Data Stores => embeddedをクリックする。

LDAPユーザー属性departmentNumbertitleを追加してやる。(memberOfはデフォルトで検索対象となっています。)

002.JPG

profileのscopeで連携する属性を追加する

昨日設定したmod_auth_openidcはscope=openid profileと指定して、ユーザーの情報を要求する設定となっています。今回はここの設定は変更せず、profileというスコープを要求されたら、役職や所属のユーザー属性を連携するという設定をします。

Top Realm Level => Scripts => OIDC Claims Scriptをクリックします。

003.JPG

GROOVYで書かれたコードがブラウザ上に表示されます。このコードの64行目以降を以下のように編集します。変更内容としては以下の2点です。

  • 連携する対象のユーザー属性にmemberOfdepartmentNumbertitleを追加
  • profileというscopeに上述の3つのユーザー属性を含む
// [ {claim}: {attribute retriever}, ... ]
claimAttributes = [
        "email": attributeRetriever.curry("mail"),
        "address": { claim, identity, requested -> [ "formatted" : attributeRetriever("postaladdress", claim, identity, requested) ] },
        "phone_number": attributeRetriever.curry("telephonenumber"),
        "given_name": attributeRetriever.curry("givenname"),
        "zoneinfo": attributeRetriever.curry("preferredtimezone"),
        "family_name": attributeRetriever.curry("sn"),
        "locale": attributeRetriever.curry("preferredlocale"),
        "name": attributeRetriever.curry("cn"),
        "memberOf": attributeRetriever.curry("memberOf"),
        "departmentNumber": attributeRetriever.curry("departmentNumber"),
        "title": attributeRetriever.curry("title")
]

// {scope}: [ {claim}, ... ]
scopeClaimsMap = [
        "email": [ "email" ],
        "address": [ "address" ],
        "phone": [ "phone_number" ],
        "profile": [ "given_name", "zoneinfo", "family_name", "locale", "name", "memberOf", "departmentNumber", "title" ]
]

動作確認

昨日と同様に、Federationされたユーザー属性を確認するので、Relying Party上に配置したphpinfo()を実行するコンテンツにアクセスします。(本記事ではhttps://rp.example.com/cgi-bin/phpinfo.php

ユーザー認証の画面が表示されるので、今回LDIFで追加したユーザー(ユーザー名はgnanashi)でサインインします。

004.JPG

認証後、Federationするユーザー属性の連携の同意画面が表示されます。ここで連携するユーザー属性を確認すると、今回追加を行った3つのユーザー属性が付加されています。

005.JPG

同意後、Relying Party上のphpinfo()が実行され、PHPアプリケーションに連携されているHeader情報が出力されます。
ばっちり、追加を行った3つのユーザー属性が連携されています。

006.JPG

まとめ

今日のまとめ(´ρ`)

  • アプリケーションに連携するユーザー属性はカスタマイズできる
  • 既存のscopeに追加できる
  • (本記事ではやってないけど、)新たにオリジナルのscopeを追加して、そこに新たに連携するユーザー属性を追加することもできる

ちなみに一番最後のやつをやるときは、Relying Partyの設定で、要求可能なスコープにも追加してやる必要があったりします。

そろそろ折り返しかな??後半戦もがんばる!

ばい!

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?