본문 바로가기

Keycloak

GitHub

Keycloak은 내장된 범용 OAuth2 provider를 통해 동작합니다. Keycloak용 native provider를 새로 추가할 필요는 없습니다. Keycloak client를 OpenID Connect client로 설정한 뒤 provider: 'oauth2' 안정적인 providerId와 같은 keycloak.

Keycloak realm에서 Capacitor 앱이 사용하는 client를 생성하거나 여세요:

  1. authorization code flow를 사용하세요.
  2. 앱 설정에서 PKCE를 활성화 상태로 유지하세요.
  3. 앱에서 사용하는 모든 redirect URI를 등록하세요. 예: myapp://oauth/keycloak 모바일용 URI와 프로덕션 웹용 HTTPS callback URL.
  4. 다음과 같은 scope를 사용하세요: openid profile email. 추가하세요 offline_access realm 및 client가 refresh token을 발행하도록 설정된 경우에만.

정확한 issuer URL은 배포 환경마다 다릅니다. 현재 Keycloak 배포에서는 일반적으로 realm metadata를 다음 위치에 게시합니다: https://keycloak.example.com/realms/my-realm/.well-known/openid-configuration하지만 일부 배포 환경에는 추가 base path가 포함될 수 있습니다. realm의 OpenID Endpoint Configuration에 표시된 issuer URL을 사용하세요.

권장: issuerUrl 플러그인이 realm metadata에서 authorization, token, logout 엔드포인트를 찾을 수 있도록:

import { SocialLogin } from '@capgo/capacitor-social-login';
const keycloakIssuer = 'https://keycloak.example.com/realms/my-realm';
await SocialLogin.initialize({
oauth2: {
keycloak: {
appId: 'your-keycloak-client-id',
issuerUrl: keycloakIssuer,
redirectUrl: 'myapp://oauth/keycloak',
scope: 'openid profile email',
pkceEnabled: true,
resourceUrl: `${keycloakIssuer}/protocol/openid-connect/userinfo`,
},
},
});
const result = await SocialLogin.login({
provider: 'oauth2',
options: {
providerId: 'keycloak',
},
});
console.log(result.result.idToken);
console.log(result.result.accessToken?.token);
console.log(result.result.resourceData);

refresh token의 경우, 다음을 요청하세요: offline_access Keycloak realm 및 client가 이 앱에 대해 refresh token을 허용하는 경우에만:

await SocialLogin.initialize({
oauth2: {
keycloak: {
appId: 'your-keycloak-client-id',
issuerUrl: keycloakIssuer,
redirectUrl: 'myapp://oauth/keycloak',
scope: 'openid profile email offline_access',
pkceEnabled: true,
},
},
});

수동 엔드포인트 폴백

“Manual endpoint fallback” 섹션

OIDC discovery가 차단되었거나 배포 환경에서 앱으로 메타데이터를 노출하지 않는 경우, 엔드포인트를 직접 설정하세요. Base URL은 Keycloak 배포 환경에 게시된 것과 동일하게 유지해야 합니다:

const keycloakRealmUrl = 'https://keycloak.example.com/realms/my-realm';
await SocialLogin.initialize({
oauth2: {
keycloak: {
appId: 'your-keycloak-client-id',
authorizationBaseUrl: `${keycloakRealmUrl}/protocol/openid-connect/auth`,
accessTokenEndpoint: `${keycloakRealmUrl}/protocol/openid-connect/token`,
redirectUrl: 'myapp://oauth/keycloak',
scope: 'openid profile email',
pkceEnabled: true,
resourceUrl: `${keycloakRealmUrl}/protocol/openid-connect/userinfo`,
logoutUrl: `${keycloakRealmUrl}/protocol/openid-connect/logout`,
},
},
});

Keycloak은 Auth Connect의 프리셋 provider ID에 포함되어 있지 않습니다. 이미 SocialLoginAuthConnect를 사용 중이더라도, 일반 oauth2 provider를 초기화하여 provider: 'oauth2' 및 providerId: 'keycloak'.

참고하세요: 예제 앱의 Keycloak OpenID Connect 엔드포인트 참조 를 통해 discovery 및 엔드포인트 경로를 확인할 수 있습니다.

사용 중이라면 Keycloak 인증 및 계정 흐름을 설계할 때, 이를 다음 항목과 연결하세요: @capgo/capacitor-social-login 사용하기 @capgo/capacitor-social-login 사용 시 네이티브 기능을 위해, @capgo/capacitor-social-login @capgo/capacitor-social-login의 구현 세부 사항은, @capgo/capacitor-passkey @capgo/capacitor-passkey의 구현 세부 사항은 @capgo/capacitor-native-biometric @capgo/capacitor-native-biometric의 구현 세부 사항은, 2단계 인증 2단계 인증의 구현 세부 사항에 대해서는