OAuth2.0/OpenID Connectの利用(2) : ソーシャルログインでOpenAMにユーザ認証してみる(Google編)

# はじめに
第2回は、Googleにユーザログインした認証情報を用いてOpenAMにもログインしてみます。
手順の流れは第1回と同じようになります。
FacebookではOAuth2.0の機能でしたが、GoogleではOpenID Connectが利用出来るので、
その機能を利用して認証します。

# Googleの設定
※この記事を投稿した時点での設定方法なので現在は変わっている可能性があります。

Googleの下記のガイドにも説明がありますので参考にしてください。
https://developers.google.com/identity/protocols/OpenIDConnect

Googleにはあらかじめ、ユーザ登録をしてログイン出来るようにしておきます。
下記URLにアクセスします。
https://console.developers.google.com/
![google_api1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/ead0883f-c6c6-bb07-bea5-c18a15a49df5.png)
Google APIsのロゴの横にドロップダウンリストがあるので、クリックします。

![google_api2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/88d8cdcb-d149-8206-2c1c-6c89fb4598bd.png)
[新しいプロジェクト]をクリックします。

![google_api3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/9a24fb3c-b0be-f6bc-32c0-22896ddc6589.png)
プロジェクト名を入れて、[作成]をクリックします。

![google_api4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/076cd74c-e209-f0c5-7a6d-70a77c52b4b2.png)
続いて左ペインに表示されている[OAuth同意画面]をクリックします。
[アプリケーションの種類]を「内部」に選択してください。
それから、[アプリケーション名]に任意の名前を入力してください。

![google_api5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/86c760ce-e5ae-9817-1656-9958e9228407.png)
少し下がって[承認済みドメイン]にOpenAMが稼働しているURLのドメインを入力してEnterキーを押します。
入力ができたら[保存]をクリックします。

![google_api6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/c64dc71a-7de9-f6b7-316e-237c7485e39d.png)
自動的に[OAuthクライアントIDの作成]という画面が表示されます。
メニューからは左ペインの[認証情報]から[認証情報を作成]をおして[OAuthクライアントIDの作成]でも遷移できます。
[アプリケーションの種類]に「ウェブアプリケーション」を選択します。

![google_api7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/7a1d219f-db62-cc9a-a15f-384f10c6ae17.png)
続いて[名前]に任意のクライアント名を入力します。
[承認済みのリダイレクトURI]にOpenAMにリダイレクトするURLを入力してEnterキーを押します。
デフォルトではOpenAMにリダイレクトするURLは以下となります。
https://[OpenAMのFQDN]/openam/oauth2c/OAuthProxy.jsp
入力後に[作成]をクリックします。

![google_api8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/f06e5d41-9d7b-1582-26bd-ca437be56933.png)
クライアントが作成された後にこの画面が表示されます。
[クライアントID]と[クライアントシークレット]の値をメモしておいてください。

これでGoogle側の設定は完了です。

# OpenAMの設定
※弊社製品のOpenAM13のバージョンで設定をしています。

![openam_authmod1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/cbeee72c-9633-4bd2-6a20-6b9030ddc29c.png)
OpenAMの管理コンソールから、[該当レルム]-[認証]-[モジュール]を開いてください。
[モジュールの作成]をクリックします。

![openam1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/a8b30610-2747-b582-ae48-663e34029d05.png)
新規モジュールの作成のダイアログが表示されるので、[モジュール名]に任意の値(ここではGoogleとしています)を入力して、
[タイプ]に「OAuth 2.0/OpenID Connect」を選択します。
そのあと[作成]をクリックします。

![openam2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/ab46eea1-1e50-5e7b-d1f0-cef806187ba0.png)
作成した認証モジュールのパラメータ設定が表示されます。
先ほどメモしたGoogleの「クライアントID」を[クライアントID]に、「クライアントシークレット」を[クライアントシークレット]に入力します。
また、それぞれのエンドポイントURLを下記のように入力してください。
認証エンドポイント URL：https://accounts.google.com/o/oauth2/v2/auth
アクセストークンエンドポイント URL：https://oauth2.googleapis.com/token
ユーザープロファイルサービス URL：https://openidconnect.googleapis.com/v1/userinfo

また、下記メタデータのURLからエンドポイントが参照できるので参考にしてください。
https://accounts.google.com/.well-known/openid-configuration

[スコープ]には、「openid profile email」を入力してください。
値のあいだはスペースで区切ってください。

![openam3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/0b5004e1-42e5-0446-7fa9-a35511267ac9.png)
また、[プロキシURL]には下記のようにGoogleでも入力したリダイレクトするURLを入力します。
https://[OpenAMのFQDN]/openam/oauth2c/OAuthProxy.jsp
[アカウントマッパー設定]は「email=mail」を入力します。
OpenAMのデータストアにはOpenLDAPを今回利用しています。GoogleのアカウントのメールアドレスをマッピングするOpenLDAP上のユーザのmail属性にあらかじめ設定しています。

※Googleから渡されるIDトークンのsubの値は仮名のIDが割り振られているため、事前に確認できません。
そのためメールアドレスでマッピングしています。

また、[存在しない場合アカウントを追加する]は無効にしています。

![openam4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/42dea30d-5a99-cebf-7bee-d27d55b4d797.png)
次の値を入力してください。
OpenID Connect 検証設定タイプ：.well-known/openid-configuration_url
OpenID Connect 検証設定値：https://accounts.google.com/.well-known/openid-configuration
OpenID Connect の ID トークン発行者の名前：https://accounts.google.com

入力が完了したら、[変更の保存]をクリックします。
ここまでで認証モジュールの設定が完了しました。

![openam5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/5a56f69a-8c3b-e7a5-13db-ada873ce22b6.png)
認証連鎖の設定で[認証連鎖の追加]をクリックして、[認証連鎖名]に任意の名前(ここではggServiceとしています)を入力して、[作成]をクリックします。
続いて、[モジュールの追加]をクリックします。
追加した「Google」の認証モジュールを設定して、「必須」を選択します。
入力が完了したら、[変更の保存]をクリックします。

![openam6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/cf55d1a6-5a55-3464-e55e-db4b4d61ba5e.png)
作成した認証連鎖を認証設定の[組織認証設定]に選択します。
入力が完了したら、[変更の保存]をクリックします。

これでOpenAMの設定は完了です。

# いよいよ動作確認

OpenAMのログインURLにアクセスします。
https://[OpenAMのFQDN]/openam/
![firefox1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/d6284123-8afc-fb9c-33df-903653171d4e.png)

下記画面に遷移します。
![firefox2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/b4f4e363-ee87-cefa-2546-a5c2b1483117.png)
アカウントを選択してください。

すると、下記の画面のとおりOpenAMで認証が自動で行われ、
マッピングしているユーザのプロファイル画面が表示されます。
![firefox3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/2ce727c9-5b77-719c-a601-a7a1d02a1cc0.png)

これで一連の流れは完了しました。

# おわりに

今回登場したGoogleはOpenID Connect Provider(OP)としての役割です。
OpenAMの認証モジュールの設定では、スコープにopenidを指定して、OpenID Connectの接続であることを送信しています。
第1回のFacebookではユーザ情報のAPIでアカウントマッピングの情報を取得しましたが、
今回はGoogleから送信されるIDトークンをOpenAMで受け取り、クレームのメールアドレスから
OpenAMのデータストアに保持しているユーザにマッピングしています。
同様に他のソフトウェアでもOAuth2.0 Authorization ServerまたはOpenID ConnectのOpenId Providerになる機能があれば、OpenAMで自動でログインすることが可能となります。
次回もまた別のアプローチでOpenAMのOAuth2.0/OpenID Connectの機能について紹介していきます。