Keycloakをお手軽に試したい(1)

[サンプルアプリケーションでKeycloakのSSO動作を確認してみよう (1/3)]
(https://www.atmarkit.co.jp/ait/articles/1710/04/news008.html)
という記事を見つけたが、バージョンが「3.2.0.Final」である。
もっとお手軽にできないか探したのが
[jboss/keycloak-examples](https://hub.docker.com/r/jboss/keycloak-examples/)です。
Deprecated, see https://github.com/keycloak/keycloak-quickstarts for new QuickStarts.
と記載があります。QuickStarts面倒なんだよなっと思い、とりあえず動かしてみた。「4.5.0.Final」ベースのようであるが動かない。

```
C:\kazu\ex>docker run -it jboss/keycloak-examples
=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /opt/jboss/keycloak-demo/keycloak

  JAVA: /usr/lib/jvm/java/bin/java

  JAVA_OPTS:  -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true

=========================================================================

03:13:47,958 INFO  [org.jboss.modules] (main) JBoss Modules version 1.8.5.Final
03:13:48,273 INFO  [org.jboss.msc] (main) JBoss MSC version 1.4.2.Final
03:13:48,289 INFO  [org.jboss.threads] (main) JBoss Threads version 2.3.2.Final
03:13:48,589 INFO  [org.jboss.as] (MSC service thread 1-2) WFLYSRV0049: WildFly Full 13.0.0.Final (WildFly Core 5.0.0.Final) starting
03:13:49,799 ERROR [org.jboss.as.controller] (Controller Boot Thread)

OPVDX001: Validation error in standalone.xml -----------------------------------
|
|  32:     <extension module="org.wildfly.extension.security.manager"/>
|  33:     <extension module="org.wildfly.extension.undertow"/>
|  34:     <extension module="org.keycloak.keycloak-server-subsystem" xmlns=""/>
|          ^^^^ 'extension' can't appear more than once within the extensions element
|
|  35:     <extension module="org.keycloak.keycloak-adapter-subsystem" xmlns=""/>
|  36:     <extension module="org.keycloak.keycloak-saml-adapter-subsystem" xmlns=""/>
|  37: </extensions>
|
| A 'extension' element first appears here:
|
|  33:     <extension module="org.wildfly.extension.undertow"/>
|  34:     <extension module="org.keycloak.keycloak-server-subsystem" xmlns=""/>
|  35:     <extension module="org.keycloak.keycloak-adapter-subsystem" xmlns=""/>
|          ^^^^
|
|  36:     <extension module="org.keycloak.keycloak-saml-adapter-subsystem" xmlns=""/>
|  37: </extensions>
|  38: <management>
|
| The primary underlying error message was:
| > ParseError at [row,col]:[34,9]
| > Message: WFLYCTL0198: Unexpected element 'extension' encountered
|
|-------------------------------------------------------------------------------

03:13:49,808 ERROR [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0055: Caught exception during boot: org.jboss.as.controller.persistence.ConfigurationPersistenceException: WFLYCTL0085: Failed to parse configuration
        at org.jboss.as.controller.persistence.XmlConfigurationPersister.load(XmlConfigurationPersister.java:143)
        at org.jboss.as.server.ServerService.boot(ServerService.java:377)
        at org.jboss.as.controller.AbstractControllerService$1.run(AbstractControllerService.java:372)
        at java.lang.Thread.run(Thread.java:748)

03:13:49,813 FATAL [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0056: Server boot has failed in an unrecoverable manner; exiting. See previous messages for details.
03:13:49,845 INFO  [org.jboss.as] (MSC service thread 1-3) WFLYSRV0050: WildFly Full 13.0.0.Final (WildFly Core 5.0.0.Final) stopped in 23ms

C:\kazu\ex>
```
これはもう自分で Docker イメージを作るかなということで、historyからの再構築したDockerfileは↓です。多分、オリジナルのベースOSはredhatだと思うけど、そこはcentosで。

```Dockerfile
from centos
RUN yum update -y && yum -y install xmlstarlet saxon augeas bsdtar unzip && yum clean all
RUN groupadd -r jboss -g 1000 && useradd -u 1000 -r -g jboss -m -d /opt/jboss -s /sbin/nologin -c "JBoss user" jboss && chmod 755 /opt/jboss
WORKDIR /opt/jboss
RUN yum -y install java-1.8.0-openjdk-devel && yum clean all
USER jboss
ENV JAVA_HOME=/usr/lib/jvm/java
ENV KEYCLOAK_VERSION=4.5.0.Final
ENV JBOSS_HOME=/opt/jboss/keycloak-demo/keycloak
ENV MAVEN_VERSION=3.3.9
ENV LAUNCH_JBOSS_IN_BACKGROUND=1
USER root
RUN curl -fsSL https://archive.apache.org/dist/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz | tar xzf - -C /usr/share && mv /usr/share/apache-maven-$MAVEN_VERSION /usr/share/maven && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn
ENV MAVEN_HOME=/usr/share/maven
USER jboss                                                                                                            
RUN cd /opt/jboss \
  && curl -s ttp://downloads.jboss.org/keycloak/$KEYCLOAK_VERSION/keycloak-demo-$KEYCLOAK_VERSION.zip -o tmp.zip \
  && unzip tmp.zip -d . \
  && mv /opt/jboss/keycloak-demo-$KEYCLOAK_VERSION /opt/jboss/keycloak-demo
RUN mvn package -f /opt/jboss/keycloak-demo/examples/preconfigured-demo/pom.xml \
  && rm -rf ~/.m2/repository
RUN cd /opt/jboss/keycloak-demo/examples/preconfigured-demo \
  && find -name *.war | grep -v ear | xargs -I {} cp {} /opt/jboss/keycloak-demo/keycloak/standalone/deployments/ \
  && cp /opt/jboss/keycloak-demo/examples/preconfigured-demo/testrealm.json /opt/jboss/keycloak-demo/keycloak/
ADD docker-entrypoint.sh /opt/jboss/
EXPOSE 8080                                                                                                             ENTRYPOINT ["/opt/jboss/docker-entrypoint.sh"]
CMD ["-b" "0.0.0.0" "-bmanagement" "0.0.0.0" "-Dkeycloak.import=/opt/jboss/keycloak-demo/keycloak/testrealm.json"]
CMD ["/bin/sh" "-c" "/bin/bash"]
```
docker-entrypoint.shを追加するので、それはこれです。

```docker-entrypoint.sh
#!/usr/bin/env bash

if [ $KEYCLOAK_USER ] && [ $KEYCLOAK_PASSWORD ]; then
    /opt/jboss/keycloak-demo/keycloak/bin/add-user-keycloak.sh -u $KEYCLOAK_USER -p $KEYCLOAK_PASSWORD >/dev/null
fi

exec /opt/jboss/keycloak-demo/keycloak/bin/standalone.sh $@
exit $?
```
ちょっと時間がないので、後でデバッグしよう。QuickStarts試せって(^^;

自分でDockerイメージ作って試したら、元々のものと同じエラーとなります。「6.0.1」のstandalone.xml見比べると以下の部分がいけていなそうです。

```
<extension module="org.keycloak.keycloak-server-subsystem" xmlns=""/>
⇒
<extension module="org.keycloak.keycloak-server-subsystem"/>
```
xmlns=""の部分を取った、standalone.xmlを用意し、以下のDockerfileでイメージを作成する。

```
from jboss/keycloak-examples
COPY standalone.xml /opt/jboss/keycloak-demo/keycloak/standalone/configuration
```
取り合えず、立ち上げ時のエラーは出なくなった(^^)/
その後、standalone.xmlを用意するのも面倒なので、sedで編集することとしました。

```
from jboss/keycloak-examples
RUN sed -i '34,36s/ xmlns=""//' /opt/jboss/keycloak-demo/keycloak/standalone/configuration/standalone.xml
```
作ったイメージを使って、起動してみる。

```
C:\kazu\ex>docker run -it -p 8080:8080 kazu:keycloak
=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /opt/jboss/keycloak-demo/keycloak

  JAVA: /usr/lib/jvm/java/bin/java

  JAVA_OPTS:  -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true

=========================================================================

13:44:18,432 INFO  [org.jboss.modules] (main) JBoss Modules version 1.8.5.Final
13:44:22,139 INFO  [org.jboss.msc] (main) JBoss MSC version 1.4.2.Final
13:44:22,251 INFO  [org.jboss.threads] (main) JBoss Threads version 2.3.2.Final
13:44:23,181 INFO  [org.jboss.as] (MSC service thread 1-2) WFLYSRV0049: WildFly Full 13.0.0.Final (WildFly Core 5.0.0.Final) starting
     (省略）
13:46:22,237 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://0.0.0.0:9990
13:46:22,240 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 13.0.0.Final (WildFly Core 5.0.0.Final) started in 127673ms - Started 1301 of 1579 services (603 services are lazy, passive or on-demand)
```
うん、keycloakは動いているね。
[authのURL](http://localhost:8080/auth)にアクセスしたら以下のメッセージが出た。http://localhost:8080/auth
にアクセスしているんだけど。

```
You need local access to create the initial admin user. 

Open http://localhost:8080/auth 
or use the add-user-keycloak script.
```
adminユーザを登録しよう。

```
[jboss@6e22a58712f3 ~]$ /opt/jboss/keycloak-demo/keycloak/bin/add-user-keycloak.sh --user admin --password admin
Added 'admin' to '/opt/jboss/keycloak-demo/keycloak/standalone/configuration/keycloak-add-user.json', restart server to load user
```
また、demoプログラム用のユーザを登録しました。[product-portal](http://localhost:8080/product-portal/)にアクセスしたけど、Bad Requestとなった。Windows 10だけど、homeとproで動き違う気がする(proではDocker for Windowsで、homeはDocker Toolboxです)。proでforbiddenなったが自分で作ったユーザにroleが無かっただけだった。homeもキャッシュをクリアしたら無事に動きました。