KeycloakでOpenID Connectを使ってSSOしたときのメモ(認可コードフロー)

はじめに

Keycloak で OpenID Connect を使って SSO をしてみたときのメモです。
今回の内容は以下の記事を参考に実際にやってみた際の手順になります。
ですので、詳しい内容は以下の記事をみていただけたらと思います。
qiita.com

前提条件

Keycloak に関しては、以下の記事で構築済みとします。(http://localhost:8080 で起動済みであることを前提とします)
kent056-n.hatenablog.com また、認可コードフローに関しては先ほど紹介した記事の「というか、認可コードフローってなんだっけ?」に記載してありますので、割愛します。

環境

Relying Party の環境

項目
OS CentOS 7.2
URL http://192.168.33.11
クライアントID(client_id) apache24
リダイレクトURI http://192.168.33.11/private/callback

OpenID Provider(Keycloak の環境)

項目
OS CentOS 7.2
URL http://192.168.33.10:8080
エンドポイント http://192.168.33.10:8080/auth/realms/master/.well-known/openid-configuration

Relying Party(RP)構築

Relying Party に関しては、「Relying Party (RP) を作る」を参考にmod_auth_openidcを使って進めていきます。

環境の用意

VirtualBoxVagrant を利用して Relying Party のサーバーを用意していきます。

$ mkdir relying_party
$ cd relying_party
$ vagrant init bento/centos-7.2

次に、ip アドレスと ssh のポート番号が重複しないように Vagrantfile を編集し、以下の二行を追記します。

config.vm.network "private_network", ip: "192.168.33.11"
config.vm.network "forwarded_port", guest: 22, host: 22222, id: "ssh"

編集できたら保存し、サーバーの起動及びログインをします。

$ vagrat up
$ vagrant ssh

ログインできたら、必要なものをインストールしていきます。vim は任意です。

# sudo -s
# yum install vim
# yum install mod_auth_openidc

Keycloak 設定

Keycloak 管理コンソールに管理者でログインしておきます。 このとき、realm が Master になっていることを確認してください。(realm が Master である必要はないですが、realm によって設定が変わる箇所があるので一応...)

クライアントの設定

[Clients] > [Create]からクライアントの設定をしていきます。 f:id:kent056-n:20180624231614p:plain Client ID は Relying Party の設定で書いた apache24、Client Protocol はopenid-connectを選択して Save を押します。 また、Access Type を public から confidential 、Consent Required を ON 、Valid Redirect URIs にhttp://192.168.33.11/private/callbackをそれぞれ設定して Save を押します。
上記の操作をした場合、以下のような設定になってるかと思います。 f:id:kent056-n:20180624231726p:plain 次に、Clients の Credentials タブを選択し、Client Authenticator が Client and Secret であることを確認し、Secret をメモしておきます。(Secret は後で使います) f:id:kent056-n:20180624232811p:plain

ユーザーの追加

SSO するユーザーを追加しておきます。 [Users] > [Add user]から追加していきます。今回は Username を u111 、Firest Name を u111 、Last Name を test として登録しておきました。 f:id:kent056-n:20180624234527p:plain 登録できたら、[Credentials]タブの Manage Password からパスワードを設定しておきます。

Relying Party 設定

mod_auth_openidc の設定

mod_auth_openidc(Apache)を設定する」を参考に httpd.conf を編集して Relying Party の設置をおこなっていきます。

# vim /etc/httpd/conf/httpd.conf

今回は httpd.conf に以下の内容を追記しました。
IDCPreservePost ディレクティブに関してはエラーが出ていたので、コメントアウトしました(ちゃんと調べよう...)
個人的に感じた注意点としては以下の二点ですかね。
・OIDCProviderMetadataURL ディレクティブに設定する URL が realm によって変わる
http://192.168.33.10:8080/auth/realms/【realm 名】/.well-known/openid-configuration
・OIDCClientSecret に先ほどメモしておいた Secret を入れる

LoadModule auth_openidc_module modules/mod_auth_openidc.so

OIDCProviderMetadataURL       http://192.168.33.10:8080/auth/realms/master/.well-known/openid-configuration
OIDCClientID                  apache24
OIDCClientSecret              c45d6804-40d6-4b46-8d62-6f6b36bba7d6
OIDCResponseType              code
OIDCScope                     "openid"
OIDCSSLValidateServer         Off
OIDCProviderTokenEndpointAuth client_secret_basic

OIDCRedirectURI               http://192.168.33.11/private/callback
OIDCCryptoPassphrase          passphrase
#OIDCPreservePost              On

<Location /private>
   AuthType         openid-connect
   Require          valid-user
</Location>
<Location /public>
   OIDCUnAuthAction pass
   AuthType         openid-connect
   Require          valid-user
</Location>

コンテンツの追加

ドキュメントルート以下にコンテンツをおいておきましょう。今回は /var/www/html/private/以下に 以下のような html ファイルを index.html としておいておきます。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>SSO の確認</title>
</head>

<body>
   <h1> success!!</h1>
</body>
</html>

確認

http://192.168.33.11/private/index.htmlにアクセスします。
以下のように Keycloak のログイン画面へ遷移するので、Username と Password をそれぞれ入力します。 f:id:kent056-n:20180625000237p:plain すると、以下のようなに同意を求められるので同意します。 f:id:kent056-n:20180625000039p:plain 最終的に以下のような画面が表示されたら成功です。 f:id:kent056-n:20180625000536p:plain

おわりに

色々設定できそうなのでやっていきたい。

参考資料

https://qiita.com/rawr/items/d4f45e094c39ef43cbdf