今回開発したもの
今回は、Microsoft AzureのAD(Active Directory)を利用して、EC-CUBEとポータルサイトでシングルサインオン(SSO)を実現する仕組みを開発しました。まず、Microsoft Azure環境を準備します。
実際の作業内容
まずSSOするためのEC-CUBEのサイトとポータルサイトを作成します。
Microsoft Azureの管理画面から、左下にある新規ボタンをクリックし、コンピューティング→Webサイトを選択します。ポータルサイトは簡単作成から、EC-CUBEはギャラリーを選択し、EC-CUBEを選びます。EC-CUBEは初期設定をします。
これでSSOを行う2つのWebサイトの作成は完了です。
次にAzureのActiveDirectory(以下AD)を作成します。
左側メニューのACTIVE DIRECTORYから追加が行えます。次にAD内にアプリケーションを作成します。ACTIVE DIRECTORYで先ほど作成したADを選択し、上部のアプリケーションというタグから作成を行います。
開発中のアプリケーションの追加を選択し、名前は自由に入力できます。種類はWebアプリケーションWeb APIを選択します。サインオンURL,アプリケーションID/URIには作成したWebサイトのURLを登録します。
作成後に、作成したアプリケーションを開き「URL の返信」の項目を編集します。こちらは、AD内での認証完了後に返り値を送るURLになります。
アプリケーションは合計2つ、Webサイトと対になるように作成します。
これでADの設定は完了になります。
最後に、SSOするためにWebサイト側に処理を追加します。今回は、EC-CUBE上ではhtml/login内、ポータルサイトではルート直下に配置しました。
下記のような形でADへリクエストを投げます
※1は、ADの画面からユーザーによるサインオンの有効化をクリックしフェデレーション メタデータ ドキュメント URLという項目の「https://login.windows.net/○○○○/FederationMetadata/2007-06/FederationMetadata.xml」○の部分です。
※2は、下表のような情報をクエリで渡します。
client_id | アプリケーションに書いてあるクライアントID |
response_mode | 「form_post」 |
response_type | 今回は「code」と「id_token」 |
scope | とりあえず「openid 」は必要 |
state | 帰り値が正しいかの認証用/ランダム値で作成 |
nonce | 同上 |
送信する項目に関しては過不足があるかもしれません。
承認を投げ、結果はADでURLの返信に設定したURLに返ってきます。ログイン成功時は、Azure AD Userのアカウント情報がbase64でエンコードされたjasonオブジェクトがpostで返ってきます。
受け取り側でWebサイト内のログイン処理を行えば完了になります。返り値としてパスワードは返ってこないためメールアドレスのみでのログインを行います。
上記でEC-CUBEのログインは完了ですが、同じログインのリクエストをポータルサイトから投げた場合、既にログインしている状態と判定され、情報入力をしないでも返り値としてbase64でエンコードされたjasonオブジェクトがpostで返って来る動作になります。
Webサイト側の細かい処理に関しては割愛させていただきます。
開発のポイントと苦労した点
開発のポイント
EC-CUBEとポータルサイトでのSSOができるようになりましたが、EC-CUBE側で登録した会員データをAPIでADに登録するところまではできませんでした。
苦労した点
AzureのADのAPIドキュメントが少なく、どのような形式でおくればいいのかという情報を探すのに多くの時間を使いました。また、今回はSSOのみの実装でしたが、実際の運用の際はEC-CUBE,ポータルサイト,AD Userの情報を同期させる必要があります。
今回はそこまで手が回りませんでしたが、また機会があれば取り組んでいきたいと考えています。
感想
今回はとても貴重な経験をさせていただきました、クラウドを使ったサービスや、SSOの処理などまだ触れたことのない機能でしたが、これからクラウドを運用する機会もあると思うのでいい足がかりになればと思います。