티스토리 뷰

카테고리 없음

Keycloak Docker / postgresql 사용

미니대왕님 2024. 1. 26. 10:18

Keycloak Docker 이미지

Keycloak 서버 Docker 이미지.

용법

독립형 모드로 부팅하려면

docker run jboss/keycloak

localhost에 노출

localhost 맵 포트 8080에서 Keycloak을 로컬로 열 수 있으려면

docker run -p 8080:8080 jboss/keycloak

관리자 계정 만들기

기본적으로 생성된 관리자가 없으므로 관리 콘솔에 로그인할 수 없습니다. 관리자 계정을 생성하려면 환경 변수를 사용하여 초기 사용자 이름과 비밀번호를 전달해야 합니다. 이는 다음을 실행하여 수행됩니다.

docker run -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak

다음을 실행하여 이미 실행 중인 컨테이너에 계정을 만들 수도 있습니다.

 

docker exec eb492f393cb4 /opt/jboss/keycloak/bin/add-user-keycloak.sh -u admin -p admin

그런 다음 컨테이너를 다시 시작합니다.

 

docker restart [eb49.............]

위 컨테이너 아이디는 Docker ps 를 통해서 확인할수 있습니다. 

 

파일을 통해 사용자 이름과 비밀번호 제공

_FILE위에서 사용된 두 가지 환경 변수( KEYCLOAK_USER_FILE및 )에 추가하면 KEYCLOAK_PASSWORD_FILE일반 환경 변수 값 대신 파일을 통해 정보를 제공할 수 있습니다. Docker Swarm의 구성 및 비밀 지원은 이 사용 사례에 완벽하게 일치합니다.

영역 가져오기

관리자 계정을 만들고 이전에 내보낸 영역 실행을 가져오려면 다음을 수행하세요.

docker run -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin \
    -e KEYCLOAK_IMPORT=/tmp/example-realm.json -v /tmp/example-realm.json:/tmp/example-realm.json jboss/keycloak

영역 내보내기

Docker 컨테이너 내에서 실행되는 Keycloak 인스턴스에서 생성/업데이트한 영역을 내보내려는 경우. Keycloak을 실행하는 컨테이너에 볼륨이 매핑되어 있는지 확인해야 합니다. 예를 들어 다음을 사용하여 docker를 통해 Keycloak을 시작할 수 있습니다.

docker run -d -p 8180:8080 -e KEYCLOAK_USER=admin -e \
KEYCLOAK_PASSWORD=admin -v $(pwd):/tmp --name kc \
jboss/keycloak

그런 다음 다음을 실행하여 이 인스턴스에서 내보내기를 가져올 수 있습니다( -Djboss.socket.binding.port-offset=100내보내기가 Keycloak 자체와 다른 포트에서 실행되도록 사용함).

docker exec -it kc /opt/jboss/keycloak/bin/standalone.sh \
-Djboss.socket.binding.port-offset=100 -Dkeycloak.migration.action=export \
-Dkeycloak.migration.provider=singleFile \
-Dkeycloak.migration.realmName=my_realm \
-Dkeycloak.migration.usersExportStrategy=REALM_FILE \
-Dkeycloak.migration.file=/tmp/my_realm.json

Keycloak의 기본 문서 사이트인 내보내기 및 가져오기 에서 내보내기 기능에 사용할 수 있는 옵션에 대한 자세한 내용이 있습니다.

데이터 베이스

이 이미지는 H2, MySQL, PostgreSQL, MariaDB, Oracle 또는 Microsoft SQL Server를 데이터베이스로 사용하는 것을 지원합니다.

환경변수를 이용하여 DB 공급업체를 직접 지정할 수 있습니다 DB_VENDOR. 지원되는 값은 다음과 같습니다.

  • h2임베디드 H2 데이터베이스의 경우
  • postgresPostgres 데이터베이스의 경우
  • mysqlMySQL 데이터베이스의 경우.
  • mariadbMariaDB 데이터베이스의 경우.
  • oracle오라클 데이터베이스의 경우.
  • mssqlMicrosoft SQL Server 데이터베이스의 경우.

값이 지정되지 않으면 DB_VENDOR이미지는 다음 논리에 따라 DB 공급업체를 검색하려고 시도합니다.

  • getent hosts( postgres, mysql, mariadb, oracle) 를 사용하는 DB 세트의 기본 호스트 이름입니다 mssql. 이는 사용자 정의 네트워크와 아래 지정된 기본 이름을 사용하는 경우에 작동합니다.
  • _ADDRDB별 환경변수 세트( POSTGRES_ADDR, MYSQL_ADDR, MARIADB_ADDR, ORACLE_ADDR) 가 있나요 ? 더 이상 사용되지 않음

DB를 감지할 수 없는 경우 기본적으로 내장된 H2 데이터베이스가 사용됩니다.

환경 변수

일반 변수 이름을 사용하여 모든 데이터베이스 유형을 구성할 수 있으며 기본값은 데이터베이스에 따라 달라질 수 있습니다.

  • DB_ADDR: 데이터베이스의 호스트 이름을 지정합니다(선택 사항). Postgres의 경우에만 장애 조치 대체 호스트에 쉼표로 구분된 호스트 이름 목록을 제공할 수 있습니다. 호스트 이름은 호스트 단독일 수도 있고 호스트와 포트의 쌍일 수도 있습니다(예: host1,host2,host1:5421,host2:5436,host1,host2:5000). 그리고 keycloak은 포트가 없는 호스트에 DB_PORT(지정된 경우)를 추가하고, 그렇지 않으면 포트가 없는 주소에만 기본 포트 5432를 다시 추가합니다.
  • DB_PORT: 데이터베이스의 포트를 지정합니다. (선택, 기본값은 DB 벤더 기본 포트)
  • DB_DATABASE: 사용할 데이터베이스 이름을 지정합니다. (선택 사항, 기본값은 keycloak)
  • DB_SCHEMA: 스키마를 지원하는 DB에 사용할 스키마 이름을 지정합니다. (선택 사항, Postgres에서는 기본값이 public입니다.)
  • DB_USER: 데이터베이스에 인증하는 데 사용할 사용자를 지정합니다(선택 사항, 기본값은 ``).
  • DB_USER_FILE: 파일 입력을 통해 데이터베이스에 인증할 사용자를 지정합니다( 대체 DB_USER).
  • DB_PASSWORD: 데이터베이스에 인증하는 데 사용할 사용자 비밀번호를 지정합니다(선택 사항, 기본값은 ``).
  • DB_PASSWORD_FILE: 파일 입력을 통해 데이터베이스에 인증하는 데 사용할 사용자 비밀번호를 지정합니다( 대체 DB_PASSWORD).

MySQL의 예

사용자 정의 네트워크 생성

docker network create keycloak-network

MySQL 인스턴스 시작

먼저 MySQL Docker 이미지를 사용하여 MySQL 인스턴스를 시작합니다.

docker run --name mysql -d --net keycloak-network -e MYSQL_DATABASE=keycloak -e MYSQL_USER=keycloak -e MYSQL_PASSWORD=password -e MYSQL_ROOT_PASSWORD=root_password mysql

Keycloak 인스턴스 시작

Keycloak 인스턴스를 시작하고 MySQL 인스턴스에 연결합니다.

docker run --name keycloak --net keycloak-network jboss/keycloak

MySQL 인스턴스에 다른 이름을 사용한 경우 환경 변수를 mysql지정해야 합니다 DB_ADDR.

PostgreSQL 예

사용자 정의 네트워크 생성

docker network create keycloak-network

PostgreSQL 인스턴스 시작

먼저 PostgreSQL Docker 이미지를 사용하여 PostgreSQL 인스턴스를 시작합니다.

docker run -d --name postgres --net keycloak-network -e POSTGRES_DB=keycloak -e POSTGRES_USER=keycloak -e POSTGRES_PASSWORD=keycloak postgres

Keycloak 인스턴스 시작

Keycloak 인스턴스를 시작하고 PostgreSQL 인스턴스에 연결합니다.

docker run --name keycloak --net keycloak-network jboss/keycloak -e DB_USER=keycloak -e DB_PASSWORD=keycloak

PostgreSQL 인스턴스에 다른 이름을 사용한 경우 환경 변수를 postgres지정해야 합니다 DB_ADDR.

마리아DB 예

사용자 정의 네트워크 생성

docker network create keycloak-network

MariaDB 인스턴스 시작

먼저 MariaDB 도커 이미지를 사용하여 MariaDB 인스턴스를 시작합니다.

docker run -d --name mariadb --net keycloak-network -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=keycloak -e MYSQL_USER=keycloak -e MYSQL_PASSWORD=password mariadb

Keycloak 인스턴스 시작

Keycloak 인스턴스를 시작하고 MariaDB 인스턴스에 연결합니다.

docker run --name keycloak --net keycloak-network jboss/keycloak

MariaDB 인스턴스에 다른 이름을 사용한 경우 환경 변수를 mariadb지정해야 합니다 DB_ADDR.

오라클의 예

Oracle 데이터베이스와 함께 Keycloak을 사용하려면 Docker 이미지에 JDBC 드라이버를 제공해야 합니다.

Oracle JDBC 드라이버 다운로드

  1. Oracle 버전에 필요한 JDBC 드라이버를 다운로드합니다.
  2. 중요: 파일 이름을 다음으로 바꾸세요.ojdbc.jar

사용자 정의 네트워크 생성

docker network create keycloak-network

Oracle 인스턴스 시작

이미 실행 중인 Oracle 데이터베이스가 있는 경우 이 단계를 건너뛸 수 있습니다. 그렇지 않으면 여기에서 Docker Hub의 carloscastillo/rgt-oracle-xe-11g 이미지를 사용하여 새 Docker 컨테이너를 시작합니다.

docker run -d --name oracle --net keycloak-network -p 1521:1521 carloscastillo/rgt-oracle-xe-11g

Keycloak 인스턴스 시작

Keycloak 인스턴스를 시작하고 Oracle 인스턴스에 연결합니다.

docker run -d --name keycloak --net keycloak-network -p 8080:8080 -v /path/to/jdbc/driver:/opt/jboss/keycloak/modules/system/layers/base/com/oracle/jdbc/main/driver jboss/keycloak

여기서 중요한 부분 중 하나는 JDBC 드라이버 위치에서 볼륨을 마운트하므로 경로가 올바른지 확인하는 것입니다. 마운트된 볼륨에는 ojdbc.jar.

또는 다음 명령을 사용하여 JDBC 파일을 컨테이너에 복사할 수 있습니다 docker cp.

docker cp ojdbc.jar jboss/keycloak:/opt/jboss/keycloak/modules/system/layers/base/com/oracle/jdbc/main/driver/ojdbc.jar

Oracle 인스턴스에 다른 이름을 사용한 경우 환경 변수를 oracle지정해야 합니다 DB_ADDR.

기본 환경 설정:

  • DB_ADDR:oracle
  • DB_PORT:1521
  • DB_DATABASE:XE
  • DB_USER:SYSTEM
  • DB_PASSWORD:oracle

마이크로소프트 SQL 서버 예

사용자 정의 네트워크 생성

docker network create keycloak-network

Microsoft SQL Server 인스턴스 시작

먼저 Microsoft SQL Server Docker 이미지를 사용하여 Microsoft SQL Server 인스턴스를 시작합니다.

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Password!23' -d --name mssql --net keycloak-network mcr.microsoft.com/mssql/server

PostgreSQL, MySQL 또는 MariaDB와 같은 다른 지원되는 데이터베이스와 달리 SQL Server는 환경 변수를 통한 초기 데이터베이스 생성을 지원하지 않습니다. 결과적으로 Keycloak에 대한 데이터베이스는 다른 방식으로 생성되어야 합니다. 원칙적으로 이는 데이터베이스를 생성할 수 있을 때까지 실행되는 이미지를 생성하여 수행할 수 있습니다.

docker run -d --name mssql-scripts --net keycloak-network mcr.microsoft.com/mssql-tools /bin/bash -c 'until /opt/mssql-tools/bin/sqlcmd -S mssql -U sa -P "Password!23" -Q "create database Keycloak"; do sleep 5; done'

이 이미지는 데이터베이스 생성을 반복적으로 시도하고 데이터베이스가 준비되면 종료됩니다.

Keycloak 인스턴스 시작

Keycloak 인스턴스를 시작하고 Microsoft SQL Server 인스턴스에 연결합니다.

docker run --name keycloak --net keycloak-network -p 8080:8080 -e DB_VENDOR=mssql -e DB_USER=sa -e DB_PASSWORD=Password!23 -e DB_ADDR=mssql -e DB_DATABASE=Keycloak -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak

Microsoft SQL Server 인스턴스에 다른 이름을 사용한 경우 환경 변수를 mssql지정해야 합니다 DB_ADDR.

docker-compose-examples/keycloak-mssql.yml전체 예를 보려면 을 참조하세요 .

JDBC 매개변수 지정

Keycloak 인스턴스를 데이터베이스에 연결할 때 JDBC 매개변수를 지정할 수 있습니다. JDBC 매개변수에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

docker run --name keycloak -e DB_VENDOR=postgres -e JDBC_PARAMS='connectTimeout=30' jboss/keycloak

사용자 정의 테마 추가

사용자 정의 테마를 추가하려면 Keycloak 이미지를 확장하여 해당 테마를 디렉터리에 추가하세요 /opt/jboss/keycloak/themes.

환영 테마를 설정하려면 다음 환경 값을 사용하십시오.

  • KEYCLOAK_WELCOME_THEME: 환영 페이지에 사용할 테마를 지정합니다(비어 있지 않아야 하며 기존 테마 이름과 일치해야 함).

사용자 정의 테마를 기본 전역 테마로 설정하려면 다음 환경 값을 사용하십시오.

  • KEYCLOAK_DEFAULT_THEME: 기본 전역 테마로 사용할 테마를 지정합니다. (기존 테마 이름과 일치해야 하며, 비어 있으면 keycloak을 사용합니다.)

사용자 정의 공급자 추가

사용자 정의 공급자를 추가하려면 Keycloak 이미지를 확장하고 공급자를 디렉터리에 추가합니다 /opt/jboss/keycloak/standalone/deployments/ .

시작 시 사용자 정의 스크립트 실행

경고 : 사용자 정의 스크립트에는 보장이 없습니다. 이미지 내의 디렉터리 레이아웃은 언제든지 변경될 수 있습니다.

컨테이너 시작 시 사용자 지정 스크립트를 실행하려면 디렉터리에 파일을 저장하세요 /opt/jboss/startup-scripts.

두 가지 유형의 스크립트가 지원됩니다.

  • WildFly .cli 스크립트 . 대부분의 경우 스크립트는 오프라인 모드 ( embed-server명령 사용)에서 작동해야 합니다. 또한 기본적으로 keycloak은 standalone-ha.xml구성을 사용한다는 점도 언급할 가치가 있습니다(다른 서버 구성이 지정되지 않는 한).
  • 모든 실행 가능( chmod +x) 스크립트

스크립트는 알파벳순으로 실행됩니다.

Dockerfile을 사용하여 사용자 정의 스크립트 추가

사용자 정의 스크립트를 직접 작성하여 추가할 수 있습니다 Dockerfile.

FROM keycloak
COPY custom-scripts/ /opt/jboss/startup-scripts/

볼륨을 사용하여 사용자 정의 스크립트 추가

단일 사용자 정의 스크립트를 볼륨으로 추가할 수 있습니다. docker run -v /some/dir/my-script.cli:/opt/jboss/startup-scripts/my-script.cli 또는 전체 디렉터리의 볼륨을 조정하여 스크립트 디렉터리를 제공할 수 있습니다.

이미지를 확장하고 volume전체 디렉터리를 지정하는 접근 방식을 결합하면 볼륨이 이미지에 제공된 모든 스크립트를 재정의합니다.

사용자 정의 명령줄 옵션을 사용하여 Keycloak 인스턴스 시작

환경 변수를 사용하여 추가 서버 시작 옵션(JAVA_OPTS 확장)을 구성할 수 있습니다 JAVA_OPTS_APPEND. 이에 대한 사용 사례는 추가 프로필 기능을 활성화하는 것입니다 .

upload_script 프로필 활성화 :

docker run -e JAVA_OPTS_APPEND="-Dkeycloak.profile.feature.upload_scripts=enabled" jboss/keycloak

클러스터링

기본 검색 프로토콜( PINGUDP 스택 및 MPINGTCP 스택)을 교체하려면 몇 가지 추가 환경 변수를 정의하면 됩니다.

  • JGROUPS_DISCOVERY_PROTOCOL- 검색 프로토콜의 이름(예: dns.DNS_PING)
  • JGROUPS_DISCOVERY_PROPERTIES- 다음 형식의 검색 프로토콜 속성이 포함된 선택적 매개변수: PROP1=FOO,PROP2=BAR
  • JGROUPS_DISCOVERY_PROPERTIES_DIRECT- jboss CLI 형식의 검색 프로토콜 속성이 포함된 선택적 매개변수: {PROP1=>FOO,PROP2=>BAR}
  • JGROUPS_TRANSPORT_STACK- 사용할 전송 스택의 선택적 이름 udp이거나 tcp가능한 값입니다. 기본:tcp

경고 : JGROUPS_DISCOVERY_PROPERTIES와 JGROUPS_DISCOVERY_PROPERTIES_DIRECT를 모두 설정하면 오류가 발생합니다. 그 중 하나만 설정할 수 있습니다.

부트스트랩 스크립트는 변수를 감지하고 standalone-ha.xml이를 기반으로 구성을 조정합니다.

핑 예시

검색 PING프로토콜은 기본적으로 스택에서 사용됩니다 udp(기본적으로 에서 사용됨 standalone-ha.xml). Keycloak 이미지는 기본적으로 클러스터 모드에서 실행되므로 이를 실행하기만 하면 됩니다.

docker run jboss/keycloak

두 인스턴스를 로컬로 사용하면 클러스터를 형성하는 것을 알 수 있습니다.

dns.DNS_PING을 사용한 OpenShift 예

dns.DNS_PINGOpenShift용 클러스터링은 관리 서비스 또는 를 사용하여 달성할 수 있습니다 kubernetes.KUBE_PING. 후자에는 view기본적으로 부여되지 않는 권한이 필요하므로 를 사용하는 것이 좋습니다 dns.DNS_PING.

템플릿 사용

전체 예제가 openshift-examples디렉토리에 포함되어 있습니다. 두 템플릿 중 하나를 실행하면 됩니다. 예는 다음과 같습니다.

oc new-app -p NAMESPACE=`oc project -q` -f keycloak-https.json

내부적으로는 무슨 일이 벌어지나요?

두 OpenShift 템플릿 모두 dns.DNS_PING내부적으로 사용됩니다. OpenShift가 호출하는 동등한 docker 기반 명령은 다음과 같습니다.

docker run \
-e JGROUPS_DISCOVERY_PROTOCOL=dns.DNS_PING -e \
JGROUPS_DISCOVERY_PROPERTIES=dns_query=keycloak.myproject.svc.cluster.local \
jboss/keycloak

이 예에서 dns.DNS_PING해당 쿼리는 A다음 쿼리를 사용하여 DNS 서버의 레코드를 기록합니다 keycloak.myproject.svc.cluster.local.

사용자 정의 검색 프로토콜 추가

검색 프로토콜을 추가하는 기본 메커니즘은 대부분의 경우를 포괄해야 합니다. 그러나 동시에 더 많은 프로토콜을 추가하거나 다른 프로토콜을 조정해야 하는 경우도 있습니다. 이러한 경우에는 에 있는 자체 cli 파일이 필요합니다 /opt/jboss/tools/cli/jgroups/discovery. JGROUPS_DISCOVERY_PROTOCOLcli 파일을 일치시켜야 합니다. 예를 들면 다음과 같습니다 .

JGROUPS_DISCOVERY_PROTOCOL=custom_protocol
/opt/jboss/tools/cli/jgroups/discovery/custom_protocol.cli

이는 Keycloak 이미지를 확장하고 파일 하나만 추가하면 쉽게 달성할 수 있습니다.

물론 사용자 정의 스크립트를 커뮤니티 이미지에 다시 제공하는 것이 좋습니다!

복제 및 장애 조치

기본적으로 Keycloak은 클러스터 설정을 사용할 때 분산 캐시로 구성되는 세션, 인증 세션, 오프라인 세션, loginFailures 및 기타 몇 가지(자세한 내용은 제거 및 만료 참조)와 같은 캐시를 복제하지 않습니다. 항목은 모든 단일 노드에 복제되지 않지만 대신 하나 이상의 노드가 해당 데이터의 소유자로 선택됩니다. 노드가 특정 캐시 항목의 소유자가 아닌 경우 이를 얻기 위해 클러스터에 쿼리합니다. 이것이 장애 조치의 의미는 데이터를 소유한 모든 노드가 다운되면 해당 데이터가 영원히 손실된다는 것입니다. 기본적으로 Keycloak은 데이터에 대해 하나의 소유자만 지정합니다. 따라서 해당 노드 하나가 다운되면 해당 데이터가 손실됩니다. 이는 일반적으로 사용자가 로그아웃되고 다시 로그인해야 함을 의미합니다. 이 주제에 대한 자세한 내용은 Keycloak 문서를 참조하세요.

분산 캐시 소유자 지정

  • CACHE_OWNERS_COUNT: 분산 캐시 소유자 수를 지정합니다(기본값은 1).

CACHE_OWNERS_COUNT>1을 설정하면 AuthenticationSessions가 복제되지 않습니다. 이는 일반적으로 필요/의도가 아니기 때문입니다( https://www.keycloak.org/docs/latest/server_installation/#cache ). AuthenticationSessions 복제를 활성화하려면 다음을 사용하십시오.

  • CACHE_OWNERS_AUTH_SESSIONS_COUNT: AuthenticationSessions에 대한 복제본 수를 지정합니다.

둥근 천장

Kubernetes/OpenShift 파일 일반 텍스트 저장소 설정

Keycloak은 Kubernetes 비밀 에 대한 저장소 구현을 지원합니다 . Docker 컨테이너에서 파일 일반 텍스트 저장소를 사용하려면 비밀 파일을 $JBOSS_HOME/secrets디렉터리에 마운트합니다. 이는 Kubernetes/OpenShift 클러스터의 비밀을 사용하는 데 사용될 수 있습니다.

기타

프런트엔드 기본 URL 지정

프런트엔드 요청에 대한 고정 기본 URL을 설정하려면 다음 환경 값을 사용하십시오(프로덕션에서는 적극 권장됨).

  • KEYCLOAK_FRONTEND_URL: Keycloak에 대한 기본 URL 지정(선택 사항, 기본값은 요청에서 검색됨)

로그 수준 지정

Keycloak의 로그 수준을 제어하는 ​​데 사용할 수 있는 두 가지 환경 변수가 있습니다.

  • KEYCLOAK_LOGLEVEL: Keycloak에 대한 로그 수준을 지정합니다(선택 사항, 기본값은 INFO).
  • ROOT_LOGLEVEL: 기본 컨테이너에 대한 로그 수준을 지정합니다(선택 사항, 기본값은 INFO).

지원되는 로그 수준은 ALL, DEBUG, ERROR, FATAL, INFO, OFF및 TRACE입니다 WARN.

예를 들어, 로그 수준은 런타임 시 변경될 수도 있습니다(docker exec 액세스 가정).

./keycloak/bin/jboss-cli.sh --connect --command='/subsystem=logging/console-handler=CONSOLE:change-log-level(level=DEBUG)'
./keycloak/bin/jboss-cli.sh --connect --command='/subsystem=logging/root-logger=ROOT:change-root-log-level(level=DEBUG)'
./keycloak/bin/jboss-cli.sh --connect --command='/subsystem=logging/logger=org.keycloak:write-attribute(name=level,value=DEBUG)'

프록시 주소 전달 활성화

프록시 뒤에서 Keycloak을 실행하는 경우 프록시 주소 전달을 활성화해야 합니다.

docker run -e PROXY_ADDRESS_FORWARDING=true jboss/keycloak

TLS(SSL) 설정

Keycloak 이미지를 사용하면 포트 8443을 통해 HTTPS를 제공하기 위한 개인 키와 인증서를 모두 지정할 수 있습니다. 이 경우 두 파일을 제공해야 합니다.

  • tls.crt - 인증서
  • tls.key - 개인 키

해당 파일은 디렉토리에 마운트되어야 합니다 /etc/x509/https. 이미지는 이를 자동으로 Java 키 저장소로 변환하고 이를 사용하도록 Wildfly를 재구성합니다. 참고: 컨테이너에서 볼륨 마운트를 사용하는 경우 파일은 루트가 소유한 컨테이너에 마운트됩니다. 키 파일에 대한 기본 권한은 700일 가능성이 높으므로 빈 키 저장소가 생성됩니다. 키 세계를 읽을 수 있게 만들거나 이미지를 확장하여 적절한 소유자와 함께 키를 추가해야 합니다.

이 방법으로 추가 CA 번들을 제공하고 상호 TLS를 설정할 수도 있습니다. 이 경우 이미지에 추가 볼륨(또는 여러 볼륨)을 마운트해야 합니다. 이러한 볼륨에는 필요한 모든 crt파일이 포함되어 있어야 합니다. 마지막 단계는 X509_CA_BUNDLE이전에 지정한 다양한 CA 인증서 번들 파일의 위치 목록을 공백( )으로 구분하여 포함하도록 환경 변수를 구성하는 것입니다. OpenShift 환경의 경우 /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt /var/run/secrets/kubernetes.io/serviceaccount/ca.crt.

참고: openshift-examplesOpenShift의 기본 설정에 대한 디렉터리를 참조하세요.

일부 지표 활성화

Keycloak 이미지는 다양한 하위 시스템에 대한 일부 통계를 수집할 수 있으며, 이는 관리 콘솔과 엔드포인트에서 사용할 수 있습니다 /metrics. 활성화할 통계 목록을 가져오는 KEYCLOAK_STATISTICS 환경 변수를 사용하여 활성화할 수 있습니다.

  • dbdatasources하위 시스템 의 경우
  • httpundertow하위 시스템 의 경우
  • jgroupsjgroups하위 시스템 의 경우

예를 들어 KEYCLOAK_STATISTICS=db,http데이터 소스 및 언더토우 하위 시스템에 대한 통계를 활성화합니다.

특수 값은 all모든 통계를 활성화합니다.

활성화되면 /metrics관리 엔드포인트에 대한 엔드포인트에서 메트릭 값이 변경되는 것을 볼 수 있습니다.

디버깅

Java 디버거를 연결하려면 다음 환경 변수를 설정하세요.

  • DEBUG=true: 이제 DEBUG_PORT듣게 될 것이다
  • DEBUG_PORT='*:8787': Keycloak이 디버거의 연결을 수신 대기하는 포트입니다. 기본적으로 JDK 9+는*:8787 localhost에서만 수신 대기하므로 모든 호스트의 연결을 수신하도록 하는 구문이 필요합니다 . *하지만 특히 아래에서 문자를 따옴표로 묶어야 한다는 점을 기억하세요 zsh.

DEBUG=true및 설정 외에도 DEBUG_PORT='*:8787'다음과 같이 디버그 포트도 게시해야 합니다.

docker run -e DEBUG=true -e DEBUG_PORT='*:8787' -p 8080:8080 -p '8787:8787' jboss/keycloak

그 외 세부 사항

이 이미지는 registry.access.redhat.com/ubi8-minimal기본 이미지를 확장하고 그 위에 Keycloak 및 해당 종속성을 추가합니다.

다양한 소스의 Keycloak을 사용하여 이미지 구축

GitHub 저장소에서 Keycloak 빌드

공식 릴리스를 다운로드하는 대신 GitHub 저장소에서 Keycloak을 빌드할 수 있습니다. 이를 수행하려면 GITHUB_REPO빌드 인수를 GitHub 저장소 이름으로 설정하고 선택적으로 GITHUB_BRANCH빌드 인수를 빌드할 브랜치로 설정하십시오. 예를 들어:

docker build --build-arg GIT_REPO=keycloak/keycloak --build-arg GIT_BRANCH=master .

그러면 저장소가 복제된 다음 소스에서 Keycloak이 빌드됩니다. GIT_BRANCH를 포함하지 않으면 master분기를 사용합니다.

다른 위치에서 Keycloak 다운로드

다른 위치에서 Keycloak 배포판을 다운로드할 수 있습니다. 예를 들어 로컬로 빌드된 Keycloak에서 Docker 이미지를 빌드하려는 경우 유용할 수 있습니다. 예를 들어:

docker build --build-arg KEYCLOAK_DIST=http://172.17.0.1:8000/keycloak-4.1.0.Final-SNAPSHOT.tar.gz .

로컬로 빌드된 Keycloak의 경우 먼저 배포판을 빌드한 다음 웹 브라우저로 제공해야 합니다. 예를 들어 SimpleHTTPServer를 사용합니다.

cd $KEYCLOAK_CHECKOUT/distribution/server-dist/target
python -m SimpleHTTPServer 8000

도커 시작 및 중지

이 이미지는 docker start및 docker stop명령을 지원하지만 구성 변경 사항을 감지하지 않습니다. Keycloak을 재구성하려면 새 컨테이너를 생성해야 합니다.

 

*************** *************** *************** *************** *************** *************** *************** *************** 

 

이 블로그 게시물은 OAuth 2.0 프레임워크에 대한 시리즈의 두 번째 부분입니다. 이전 기사에서 OAuth 2.0이 무엇인지 간략하게 설명했기 때문에 OAuth 2.0에 익숙하지 않다면 Keycloak 설정을 시작하기 전에 먼저 확인하는 것이 좋습니다.

이전 글은 매우 이론적이었지만 이번에는 바뀔 것입니다. 앞으로 나올 이 하나와 두 개는 OAuth 2.0 프레임워크의 모든 핵심 행위자를 정의하는 작은 프로젝트를 구축할 것이기 때문에 더 실용적입니다.

대상 프로젝트는 세 부분으로 구성됩니다.

  • 인증 서버 (Keycloak) — 액세스 및 ID 토큰을 발행하는 데 사용되는 애플리케이션
  • 보호되는 리소스 (Java, Spring Boot, 백엔드 애플리케이션) - REST API를 사용하여 정보를 제공하지만 보안상의 이유로 유효한 액세스 토큰이 필요한 애플리케이션
  • 클라이언트 (Angular, 프런트엔드 애플리케이션) — 액세스 토큰을 얻고 백엔드 앱을 쿼리하려면 사용자가 로그인해야 하는 웹사이트입니다.

이 기사에서는 인증 서버 , 기본 파일 생성 방법 docker-compose.yaml, Keycloak 인스턴스 구성 방법에 중점을 둘 것입니다.

 

Keycloak 인스턴스 실행

프로젝트별 구성을 추가하기 전에 테스트에 편리한 URL 주소를 확보할 수 있도록 OS의 호스트 파일을 구성했습니다. 이 파일의 위치는 OS에 따라 다릅니다.

찾았으면 다음 줄을 추가하세요.

127.0.0.1 키클로크

그 후에는 대신 URL을 http://localhost사용할 수 있습니다 http://keycloak. 꼭 필요한 단계는 아니라는 점에 유의하세요. 이 블로그 게시물을 통해 설명할 것처럼 이 단계를 건너뛰고 localhost대신 를 사용해도 됩니다.keycloak

이를 통해 Keycloak 설정을 이동할 수 있습니다. 가장 먼저 해야 할 일은 전체 Keycloak 구성이 포함될 Docker Compose 파일을 만드는 것입니다. Docker Hub의 문서를 살펴보면 jboss/keycloak Docker 이미지가 H2, MySQL, PostgreSQL, MariaDB, Oracle 또는 Microsoft SQL Server와 같은 여러 데이터베이스를 지원한다는 것을 알 수 있습니다 .

저는 PostgreSQL을 사용하기로 결정했습니다. 따라서 다음은 docker-compose.yaml 에 있는 postgres 구성 요소에 대한 간단한 정의입니다 .

버전: "3.8" 
서비스:  postgres: 
    이미지: postgres:13.0-alpine 
    컨테이너_이름: postgres 
    포트: 
      - 5432:5432 
    환경: 
      - POSTGRES_USER=postgres 
      - POSTGRES_PASSWORD=postgres 
    볼륨: 
      - postgres:/var/lib/postgresql/data 
      - ./infra/postgres:/docker -entrypoint-initdb.d볼륨: 
  포스트그레스:

와 같은 표준 정의 나 매핑 image과 별도로 Docker Hub for postgres image 에 문서화된 환경 변수를 사용하여 데이터베이스에 대한 사용자 및 비밀번호를 설정하기로 결정했습니다 .container_nameportspostgres

다음으로 언급할 가치가 있는 것은 을 추가했다는 것입니다 volume. 첫 번째는 내 로컬 컴퓨터에 컨테이너 데이터를 유지하기 위한 것이고 후자는 초기 SQL 스크립트를 추가하기 위한 것이므로 처음 시작하는 동안 실행되고 생성됩니다. Keycloak이 사용할 데이터베이스와 사용자.

암호화된 비밀번호 'keycloak'을 사용하여 사용자 키클로크 생성; 
데이터베이스 키클로크 생성; 
데이터베이스 keycloak에 대한 모든 권한을 keycloak에 부여합니다.

이 스크립트는 호스트 시스템의 폴더에 .infra/postgres있으며 postgres Docker 컨테이너 내부의 디렉터리에 매핑됩니다 /docker-entrypoint-initdb.d.

그런 다음 Keycloak 구성 요소 정의로 넘어갈 수 있습니다 .

keycloak: 
    이미지: jboss/keycloak:11.0.2 
    컨테이너_이름: keycloak 
    포트: 
      - 8080:8080 
    환경: 
      - KEYCLOAK_USER=admin 
      - KEYCLOAK_PASSWORD=admin 
      - DB_VENDOR=postgres 
      - DB_ADDR=postgres 
      - DB_DATABASE=keycloak 
      - DB_USER=keycloak 
      - DB_PASSWORD=keycloak 
    의존 관계: 
      - 포스트그레스

여기서도 로켓 과학은 없습니다. image표준 정의 container_name및 매핑 외에도 Keycloak을 데이터베이스 에 연결하도록 조정 하고 관리자의 기본 사용자 이름과 비밀번호를 설정하는 데 사용되는 변수 ports만 볼 수 있습니다 .environemntpostgres

결과 docker-compose.yaml 파일은 다음과 같습니다.

버전: "3.8" 
서비스: 
  
  keycloak: 
    이미지: jboss/keycloak:11.0.2 
    컨테이너_이름: keycloak 
    포트: 
      - 8080:8080 
    환경: 
      - KEYCLOAK_USER=admin 
      - KEYCLOAK_PASSWORD=admin 
      - DB_VENDOR=postgres 
      - DB_ADDR=postgres 
      - DB_DATABASE=keycloak 
      - DB_USER=keycloak 
      - DB_PASSWORD=keycloak 
    에 따라 다름: 
      - postgres  postgres: 
    이미지: postgres:13.0-alpine 
    컨테이너_이름: postgres 
    포트: 
      - 5432:5432 
    환경: 
      - POSTGRES_USER=postgres 
      - POSTGRES_PASSWORD=postgres 
    볼륨: 
      - postgres:/var/lib/postgresql/data 
      - ./infra/postgres:/docker -entrypoint-initdb.d볼륨: 
  포스트그레스:

이제 터미널로 이동하여 docker-compose.yaml 파일이 있는 폴더로 이동 하고 다음 명령을 실행합니다.

> docker-compose up -d keycloak
     기본 드라이버를 사용하여 "keycloak-security-example_postgres" 
    볼륨 생성 기본 드라이버를 사용하여 "keycloak-security-example_prometheus" 볼륨 생성 
    postgres 가져오기(postgres:13.0-alpine)... 
    13.0-alpine: 가져오는 중 library/postgres 
    188c0c94c7c5: 풀 완료 
    56f1d1b70e7f: 풀 완료 
    9b4f01476d2b: 풀 완료 
    16419214bc02: 풀 완료 
    4886fc567835: 풀 완료 
    9026d4fbeafa: 풀 완료 
    001c336294eb: 풀 완료 
    8abc6d154e9f : 전체 
    다이제스트 가져오기: sha256:d26ddee3648a324a9747b3257236322141920d5f9a82ca703def6bff1cca7067 
    상태: postgres에 대한 최신 이미지 다운로드:13.0- alpine 
    Keycloak 당기기(jboss/keycloak:11.0.2)... 
    11.0.2: jboss/keycloak에서 당기기 
    0fd3b5213a9b: 당기기 완료 
    aebb8c556853: 당기기 완료 
    ed3ae09abceb: 당기기 완료 
    85e3448ea914: 당기기 완료 
    9f0e9c75b3b9: 당기기 완료 
    다이제스트: sha25 6:8cdd41cb4a0b210ed3f07df5d18306762e1755bb8d6c1ffc5e083c080528783d 
    상태 : jboss/keycloak에 대한 최신 이미지 다운로드:11.0.2 
    Postgres 만들기 ... 완료 
    keycloak 만들기 ... 완료

위 명령을 사용하여 Docker 이미지를 모두 가져오고(다운로드하고) 새 컨테이너를 시작했습니다.

모든 것이 제대로 되었는지 확인하려면 다른 Docker 명령을 실행하여 실행 중인 컨테이너를 확인하세요.

> docker ps
 컨테이너 ID 이미지 상태 이름 
f9a67e3b9756 jboss/keycloak:11.0.2 최대 33초 keycloak 
5d781b2b8d6f postgres:13.0-alpine 최대 34초 postgres

상태는 Up괜찮아보이네요 :) 어떤 이유로 인해 그렇지 않은 경우 오타가 없는지 확인하십시오.

영역, 클라이언트, 역할 및 사용자 추가

Keycloak이 실행 중인 것으로 확인되었으므로 로그인해 보겠습니다. 따라서 브라우저에서 http://keycloak:8080 으로 이동 하면 홈 페이지로 연결됩니다.

관리 콘솔을 선택하면 로그인 페이지로 리디렉션됩니다. 여기에서 관리자 자격 증명을 제공해야 합니다( docker-compose.yaml 파일에서 정의된 것과 동일).

  • 사용자 이름: 관리자
  • 비밀번호: 관리자

로그인하면 이제 Keycloak의 마스터 영역 내부에 있게 됩니다 .

그런데 영역이란 무엇입니까? 이것은 순전히 Keycloak이며 사용자, 클라이언트 등과 같은 리소스를 그룹화하는 데 사용됩니다. 영역은 서로 격리되어 있으므로 한 영역의 사용자는 다른 영역에서 볼 수 없으므로 이러한 영역은 인증 서버의 별도 인스턴스로 처리될 수 있습니다.

새 영역을 생성하려면 현재 영역 마스터 이름의 왼쪽 상단에 있는 드롭다운 목록을 클릭하세요 . 그런 다음 영역 추가 버튼을 클릭합니다 .

다음 페이지는 매우 간단합니다. 여기에 영역 이름을 제공하기만 하면 됩니다. 이름 테스트를 하러 갑니다 .

생성 버튼을 누르면 새 영역이 성공적으로 생성됩니다.

클라이언트 자격 증명 만들기

우리는 OAuth 2.0  OpenID를 기반으로 인증 및 권한 부여를 구축하고 있기 때문에 두 가지 다른 애플리케이션, 즉 일부 데이터를 서버하는 백엔드 애플리케이션인 보호 리소스와 보호 리소스 의 데이터에 액세스하려는 프런트엔드인 클라이언트 애플리케이션을 갖게 됩니다. . 이를 수행하려면 프런트엔드 애플리케이션에 액세스 토큰이 있어야 합니다 . 그리고 클라이언트를 인증 서버 측에 등록해야 합니다( 클라이언트 ID  클라이언트 비밀번호가 있음 ) . 우리의 경우 Keycloak입니다 .

프런트엔드 앱용 클라이언트 생성 관련 기사에서 다루겠습니다. 지금은 Keycloak 설정을 테스트하기 위한 클라이언트를 생성하겠습니다.

따라서 클라이언트 페이지(왼쪽 메뉴에 있음) 로 이동하여 오른쪽에 있는 생성 버튼을 클릭합니다.

새 보기에서는 test_client 가 될 클라이언트 이름만 제공하면 됩니다 .

저장 버튼을 누르면 새로 생성된 클라이언트에 대한 세부 정보 페이지가 표시됩니다. 프런트엔드 클라이언트 구성을 완료하려면 먼저 액세스 유형을 기밀 로 설정한 다음 Service Accounts Enabled  Authorization Enabled 를 켜야 합니다 . 마지막으로 우리의 경우 프런트엔드 애플리케이션의 기본 URL인 http://localhost:80 , http://localhost:4200 이 될 리디렉션 URI를 제공해야 합니다 (다음 문서에서 빌드될 예정).

client_credentials이제 OAuth 2.0 부여 유형을 사용하여 토큰을 받을 수 있는지 테스트해 보겠습니다 . 즉, 이 권한 부여 유형은 리소스 소유자(사람, 사용자)가 없지만 클라이언트 애플리케이션이 액세스 토큰을 사용하여 보호되는 리소스에 접근해야 하는 경우에 사용됩니다. 이 흐름에서 클라이언트 애플리케이션은 인증 서버에 자격 증명과 범위만 제공하고 결과적으로 유효한 토큰을 반환합니다.

테스트하기 위해 Postman을 사용하고 있지만 , 와 같은 다른 도구를 선호한다면 curl선호하는 도구를 사용하세요.

Postman 에서 요청 탭을 만들고 다음 정보를 제공합니다.

토큰 Url은 표준 Keycloak URL입니다. test귀하의 영역 이름을 나와 다르게 지정하는 경우 위 경로를 귀하의 이름으로 바꿔야 합니다 .

그런 다음 본문 탭에서 옵션을 선택 x-www-form-urlencoded하고 표에 다음 데이터를 제공합니다.

  • grant_type: 클라이언트_자격 증명
  • scope: 공개 ID
  • client_id: 테스트_클라이언트
  • client_secret: 8ac27a39-fa84-46b9-8c30-b485056e0cea

자신만의 Keycloak 인스턴스를 설정한 경우에는 client_secret다를 수 있습니다. 이를 확인하려면 test_clientKeycloak의 클라이언트 페이지로 돌아가서 탭을 선택하세요 Credentials. 거기에서 당신은 당신의 비밀을 찾아야합니다.

마지막으로 Send버튼을 클릭하면 액세스, ID 및 새로 고침 토큰이 포함된 다음 응답을 받아야 합니다.

{ 
    "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJXYmdnRkNBNzJ4UG5KYWNUZTRHMzdEN1NDWFpJOW8wQVZMTWd0d0tfamhRIn0..ihCQGFWRdr1NR7el7zsnnXZFwonOpFgEE_MHBlYSq07s2JhjsLJauvQ9erTM5YV_gmY-Q-QpmpRI-qq4miF9hem8qxXzxBkei7cXyYYQeiz44MwkusUW75VChfsYljgRNUSJM5G4_O636xWQNc2ET5v8508CPpgVIvl4QFKYQui3J2BADH8AyDihgaOcF5hfrutuEpH6AINvBmUebUKOLG3ZyST81Q3GjmSZmBaL7RK29uTm94i1HVqfXgRLIuf5zxLucq_gU4KM8c3mB5d8ZfJOMl8nOnYDbEbiGVEP_coz9x3iF2Lf3Fp8K2zez59w4yvGTy39Whns-KhtX02yAQ", 
    "expires_in": 300, 
    "refresh_expires_in": 1800, 
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJjZGQ0ZTczOC0zMDU1LTQ5YjAtOTM2Mi00NjAyNTZiNTdkNTQifQ.eyJleHAiOjE2MTM2MjkwNzYsImlhdCI6MTYxMzYyNzI3NiwianRpIjoiMDhmZjgyYjktNTZhZS00MjQ0LTg4MWEtYjY2MmU5NDU2YWFiIiwiaXNzIjoiaHR0cDovL2tleWNsb2FrOjgwODAvYXV0aC9yZWFsbXMvdGVzdCIsImF1ZCI6Imh0dHA6Ly9rZXljbG9hazo4MDgwL2F1dGgvcmVhbG1zL3Rlc3QiLCJzdWIiOiIwODhjNTdiMy1mNGJlLTQwOTQtOGQzNC00Y2UyNWQ1OGUzY2IiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoidGVzdF9jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiZTE2MTEzY2YtMGRiOS00ZWQzLThiYzAtMjVkZjQ2ODA1NjY5Iiwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSJ9._aclvBR9ij5B6Zq1EO7g_5RoZA6pK6SqvMlj1Sb5ero", 
    "token_type": "bearer ",
    "id_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJXYmdnRkNBNzJ4UG5KYWNUZTRHMzdEN1NDWFpJOW8wQVZMTWd0d0tfamhRIn0..TzbQRhk_z0YqfUnDi2T4iYHtw0flKTWh4MNcsAX3gqDV3GbxS2I0h45Z56ZurtPHf1idFKLo44mK-vopR3pt0WSzZx4U9_kQWPOK8BvoUIlft4lGNzgEU_wVIKG3B7RBCq82DVfC6b6g8yGI9D8xXkPCApwqxPoGVs1eTizCWubuRjddQzZTZ5Ida4vvPLXhRwVMNYMEb7h_4Oy8GC2zGNulBCUMpUDmLkqfSaOzKHwn8gOBJABIdmAqB5GbVDtfwpPdjk4exAohU8Gd6YcMSo2H94ZGJtEWZyZw_hOUbF1g5t9rxNnWCDuRkzZBFmVOeqzUZ3n-YQjnYJrpyQG8tg", 
    "not-before-policy": 0, 
    "session_state": "e16113cf-0db9-4ed3-8bc0-25df46805669", 
    "scope": "openid email profile" 
}

엄청난! 🤟 원한다면 JWT.io 웹사이트에서 이 모든 토큰을 확인하여 이 모든 토큰에 어떤 데이터가 들어 있는지 알아볼 수 있습니다.

사용자 및 역할 생성

Keycloak에 클라이언트를 등록한 후에는 사용자(리소스 소유자)를 생성하고 보호된 리소스에 대해 수행할 수 있는 작업을 구별하기 위해 다양한 역할을 부여해야 합니다.

VISITOR첫 번째 단계는 & 라는 두 가지 역할을 정의하는 것입니다 ADMIN. 적어도 이 데모 프로젝트에서는 이름과 실제 의미가 그다지 중요하지 않습니다.

따라서 VISITOR열린 Keycloak 영역 페이지를 정의하고 왼쪽 패널에서 사용 가능한 역할 로 이동합니다. 그런 다음 역할 추가 버튼을 클릭합니다. 새 화면에서 역할 이름  설명을 입력 하고 저장을 누르세요 .

역할 에 대해서도 ADMIN동일하게 수행하십시오.

이제 새로운 사용자 등록으로 넘어갑니다. 따라서 왼쪽 패널에서 사용 가능한 사용자 버튼을 클릭 한 다음 사용자 추가 버튼을 클릭합니다. 첫 번째 페이지에서는 사용자 이름, 이메일 등과 같은 사용자에 대한 몇 가지 기본 정보를 제공해야 합니다.

저장 버튼을 누르면 luke상세 페이지가 나타납니다. 방금 생성된 역할을 할당하려면 역할 매핑 탭으로 이동하여 역할(제 경우에는 VISITOR)을 선택한 다음 선택 항목 추가 버튼을 클릭해야 합니다.

마지막으로 이 사용자에 대한 비밀번호를 설정해야 하므로 Credentials 탭으로 이동하여 비밀번호를 제공합니다(제 경우에는 password). 임시 토글이 꺼져 있는지 확인하십시오 .

원하는 경우 두 번째 역할에 할당될 두 번째 사용자를 생성할 수 있습니다.

모든 것이 올바르게 설정되었는지 다시 테스트하기 위해 Postman 을 사용하겠습니다 . 이전과 마찬가지로 토큰을 받고 싶지만 이번에는 다른 OAuth 2.0 부여 유형을 사용합니다. 이번에는 클라이언트와 리소스 소유자 자격 증명을 모두 제공하라는 요청을 받는 권한 부여 유형을 사용하겠습니다 password.

HTTP 메소드와 Url은 변경되지 않으며 다음과 같습니다.

또한 콘텐츠 유형은 동일하게 유지됩니다 — x-www-form-urlencoded. 다른 점은 요청 본문입니다(완전히는 아님).

  • grant_type: 비밀번호
  • scope: 공개 ID
  • client_id: 테스트_클라이언트
  • client_secret: 8ac27a39-fa84-46b9-8c30-b485056e0cea
  • username: 루크
  • password: 비밀번호

결과적으로 다시 토큰 세트를 얻습니다. 그런 다음 액세스 토큰을 JWT.io 에 복사하여 붙여넣어 디코딩하면 사용자 및 할당된 역할에 대한 기본 정보가 포함되어 있음을 알 수 있습니다.

엄청난! 우리는 완전한 운영 인증 서버를 보유하고 있습니다!

원클릭 설정

승인이 실행되고 있다는 것은 놀라운 일이지만 여기에 문제가 있습니다. 앞으로 이러한 수동 단계를 피하는 방법은 무엇입니까? 이보다 더 간단한 것은 없습니다. 방금 만든 영역을 내보낼 수 있습니다!

손을 더럽히기 전에 한 가지 말씀드리겠습니다. 이 접근 방식은 개발 목적으로는 매우 좋다는 점을 명심하시기 바랍니다. 그러나 주로 사용자 및 그 자격 증명에 대한 정보를 내보낼 것이기 때문에 프로덕션에는 사용하지 말 것을 권합니다. 이는 안전하지 않습니다.

Keycloak 인스턴스가 아직 실행 중이라면 중지하세요. 그런 다음 docker-compose.yaml 파일 로 이동하여 keycloak서비스 용 새 볼륨을 추가합니다 . ./:/temp(단단한 상태를 유지하기 위해 env 변수를 무시합니다.)

keycloak: 
    이미지: jboss/keycloak:11.0.2 
    컨테이너_이름: keycloak 
    포트: 
      - 8080:8080 
    볼륨: 
      - ./:/temp 
    종속_온: 
      - postgres

이제 docker-compose up -d keycloak명령으로 Keycloak을 다시 실행하십시오. 이를 실행하면 이제 콘솔을 사용하여 실행 중인 Docker 컨테이너 내에서 내보내기 명령을 실행할 수 있습니다( 여기에 설명된 솔루션 기반 ).

> docker exec -it keycloak /opt/jboss/keycloak/bin/standalone.sh 
   -Djboss.socket.bound.port-offset=100 
   -Dkeycloak.migration.action=export 
   -Dkeycloak.migration.provider=singleFile 
   -Dkeycloak.migration .realmName=테스트 
   -Dkeycloak.migration.usersExportStrategy=REALM_FILE 
   -Dkeycloak.migration.file=/temp/realm-test.json

결과적으로 프로젝트의 루트 디렉터리에 realm-test.json 파일이 생성됩니다. 좋습니다. 이제 이 JSON 파일 가져오기를 설정하겠습니다.

이제 임시 볼륨을 변경해야 하는 docker-compose.yaml 파일 로 돌아가서 추가 명령과 새 환경 변수를 추가합니다.

keycloak: 
    이미지: jboss/keycloak:11.0.2 
    컨테이너_이름: keycloak 
    포트: 
      - 8080:8080 
    환경: 
      - KEYCLOAK_IMPORT=/tmp/realm-test.json 
    볼륨: 
      - ./infra/keycloak/realm-test.json:/tmp /realm-test.json 
    명령: ["-Dkeycloak.profile.feature.upload_scripts=enabled"] 
    의존_온: 
      - postgres

다음으로 realm-test.json을 새 폴더 /infra/keycloak (또는 원하는 위치) 에 복사해야 합니다 .

이제 모든 Docker 컨테이너와 볼륨을 제거하고 Keycloak을 다시 시작하면 이전에 제공한 것과 동일한 데이터가 표시됩니다!

그것은 OAuth 2.0에 관한 시리즈의 두 번째 부분이었습니다. 마음에 드셨다면 댓글로 알려주세요. 이 주제에 대한 더 많은 콘텐츠에 관심이 있다면 내 다른 기사를 확인하세요.

평소와 마찬가지로 내 GitHub 저장소에서 전체 코드를 찾을 수 있습니다.

댓글