>source

스프링 부트 응용 프로그램이 있고 사용자를 인증하기 위해 keycloak을 사용하고 있습니다. 내 응용 프로그램에서 사용자 이름과 암호를 기다리는 끝점을 만들 계획입니다. 키 클로 크에 로그인하고 사용자 이름/암호가 유효한 경우 액세스 토큰을 요청하고 사용자에게 다시 제공합니다.

이 로그인을 keycloak에 어떻게 할 수 있습니까?

내가보기에 나는 public 클라이언트가 내 keycloak에 사용자 이름/비밀번호를 사용하도록 만들었지 만 여기에는 resource_id 그래서 나는 access_token 에서 confidential 고객.

나는 access_token 공개 클라이언트에서 응답 코드가 200 (따라서 로그인이 성공했습니다) 그런 다음 다른 요청을 confidential 다시 얻을 클라이언트 access_token 실제로 작동하는 것은 무엇입니까?

미리 감사드립니다.


  • 답변 # 1

    I am planning to make an endpoint in my application what waits a username and a password, it logs into the keycloak and if the username/password is valid ask for an access token and give it back to the user.

    Spring 앱을 올바르게 구성하고 사용자가 사용에 대해 인증되는 Keycloak 클라이언트 인 경우 Authorization Code Flow (즉,Standard flow Enabled on Keycloak), 사용자가 앱에 로그인하고 Keycloak으로 리디렉션되고 자신을 인증합니다. 사용자가 성공적으로 인증되면 사용자가 리디렉션됩니다 (아마) 다시 앱으로 돌아 가면 해당 앱이 액세스 토큰을 다시 받게됩니다. 그런 다음 해당 액세스 토큰을 사용하여 인증 된 사용자를 대신하여 작업을 수행 할 수 있습니다.

    As I see I need to have a public client to make my keycloak use username/password, but this does not contain any resource_id so I need an access_token from a confidential client.

    RFC 6749 OAuth 2.0 사양에서 다음을 읽을 수 있습니다.

    confidential

    
     Clients capable of maintaining the confidentiality of their
      credentials (e.g., client implemented on a secure server with
      restricted access to the client credentials), or capable of secure
      client authentication using other means.
    
    

    공공의

     Clients incapable of maintaining the confidentiality of their
      credentials (e.g., clients executing on the device used by the
      resource owner, such as an installed native application or a web
      browser-based application), and incapable of secure client
    
    

    사용하지 않기 때문에순수한웹 브라우저 응용 프로그램 또는 휴대 전화가 아니라안전한 백엔드, 당신은 confidential client .

    "Resource Owner Password Credentials Grant"(즉,Keycloak에서 활성화 된 직접 액세스 권한). 고객의 기밀 없이도 계속 사용할 수 있습니다. 와 함께 public client Keycloak의 토큰 요청 :

    POST -d "client_id=<client_id>"
         -d "username=<username>"
         -d "password=user_password"
         -d "grant_type=password"
          <KEYCLOAK_HOST>/auth/realms/<REALM_NAME>/protocol/openid-connect/token>
    
    

    와 함께 confidential client:

    POST -d "client_id=<client_id>"
         -d "client_secret=<client_secret>"
         -d "username=<username>"
         -d "password=user_password"
         -d "grant_type=password"
          <KEYCLOAK_HOST>/auth/realms/<REALM_NAME>/protocol/openid-connect/token>
    
    

    당신은 여분의 필드를 얻었다 -d "client_secret=<client_secret>" .

    그러나 다음 사항에 유의하십시오.

    The resource owner password credentials grant type is suitable in cases where the resource owner has a trust relationship with the client, such as the device operating system or a highly privileged application.The authorization server should take special care when enabling this grant type and only allow it when other flows are not viable.

관련 자료

  • 이전 sql - 여러 SELECT 문이있는 사례
  • 다음 android - Java 스레드는 생성 스레드가 데몬 인 경우에만 데몬입니까?