2017-11-29 28 views
1

저는 Identity Brokering 기능과 외부 IDP를 사용하고 있습니다. 따라서 사용자가 외부 IDP UI에 로그인하면 KeyCloak 브로커 클라이언트는 외부 IDP에서 JWT 토큰을 받고 KeyCloak은 우리가 자원에 액세스하는 JWT를 제공합니다. Default Identitiy Provider 기능을 설정 했으므로 로그인시 외부 IDP 로그인 화면이 사용자에게 표시됩니다. 즉, 사용자와 암호는 외부 IDP에 저장됩니다.외부 IDP 중개를 사용하여 KeyCloak을 통한 프로그램 사용자 이름/비밀번호 액세스

테스트에서 프로그래밍 방식으로 "직접 액세스 부여"(리소스 소유자 비밀번호 부여)를 사용하여 로그인해야 할 때 문제가 발생합니다. KeyCloak에 암호가 저장되지 않으므로 로그인시 KeyCloak에서 401 Unauthorized 오류가 발생합니다. 사용자 암호를 변경하려고하면 작동하기 시작 했으므로 KeyCloak에서 사용자 암호가 제공되지 않고 "직접 액세스 허용"을 사용하는 것이 문제입니다. KeyCloak는 프로그래밍 방식의 로그인에서 외부 IDP를 호출하지 않습니다.

액세스 토큰을 얻기 위해 다음 코드를 사용하지만 유효한 사용자 이름/암호를 전달할 때마다 401 오류가 발생합니다.

org.keycloak.authorization.client.util.HttpResponseException: Unexpected response from server: 401/Unauthorized 

해당 클라이언트에 대해 직접 액세스 권한을 사용할 수 있습니다.

public static String login(final Configuration configuration) { 
    final AuthzClient authzClient = AuthzClient.create(configuration); 
    final AccessTokenResponse accessTokenResponse = authzClient.obtainAccessToken(USERNAME, PASSWORD); 
    return accessTokenResponse.getToken(); 
    } 

어떤 방법으로 해결할 수 있습니까? 예를 들어 "Direct Access Grant"에서 Identity Broker를 호출하면 KeyCloak이 유효한 토큰을 제공합니다.

답변

0

KeyCloak에 초기 ID 공급자의 암호에 대한 정보가 없다는 것이 문제였습니다. 프로그래밍 방식의 토큰 교환에 사용해야하는 token exchange feature이 있습니다.