web-dev-qa-db-fra.com

Se connecter à Keycloak à l'aide d'une API

J'ai 2 applications différentes: dire Application1 et Application2

  1. J'ai intégré Application2 avec keycloak et je peux me connecter à cette application à l'aide de la page de connexion de Keycloak.

  2. Maintenant, ce que je veux, c’est que si je me connecte à mon Application1 (sans keycloak), je devrais pouvoir appeler une API de keycloak pour me connecter à application2 (sans afficher la page de connexion de keycloak).

C'est faisable? Si oui comment?

Toute aide sera grandement appréciée.

Merci

9
Akhil Prajapati

Vous demandez effectivement à vos utilisateurs de faire confiance à Application1 pour gérer leurs identifiants de porte-clés en toute sécurité. Ceci n'est pas recommandé car

  1. une meilleure sécurité est obtenue si l'utilisateur est redirigé vers keycloak pour entrer ses informations d'identification. Dans un monde idéal, aucune application cliente ne devrait gérer ou avoir accès aux informations d'identification de l'utilisateur.
  2. Cela annule le but de la connexion unique, où un utilisateur devrait uniquement entrer ses informations d'identification pour la première application à laquelle il doit accéder (à condition que sa session ne soit pas arrivée à expiration).

Mais si vous contrôlez et pouvez faire confiance à Application1 et que vous devez le faire pour des raisons héritées ou autres, vous pouvez activer le flux d'informations d'identification du propriétaire de la ressource appelé "Accès direct" dans la définition du client Keycloak, puis POST les informations d'identification de l'utilisateur en tant que type de données form-urlencoded à

https://<keycloak-url>/auth/realms/<realm>/protocol/openid-connect/token

Les paramères seront 

grant_type=password
client_id=<Application1's client id>
client_secret=<the client secret>
username=<the username>
password=<the password>
scope=<space delimited list of scope requests>

La réponse sera un objet JWT valide ou une erreur 4xx si les informations d'identification ne sont pas valides.

7
shonky linux user

Si j'ai bien compris votre question, vous essayez d'appeler un service réservé au support via une autre application déjà connectée. Vous n'avez pas non plus précisé si vous utilisiez Spring Boot ou un autre cadre similaire en utilisant le démarrage de printemps pour votre application côté serveur.

L'exemple suivant illustre l'appel simple d'une API authentifiée à une autre, à l'aide de Spring Boot:

import org.keycloak.KeycloakPrincipal;
import org.keycloak.adapters.RefreshableKeycloakSecurityContext;
import org.keycloak.adapters.springsecurity.account.SimpleKeycloakAccount;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

@Component
public class AnotherServiceClient {
    public TypeOfObjectReturnedByAnotherService getFromAnotherService() {
        RestTemplate restTemplate = new RestTemplate();
        String endpoint = "http://localhost:40030/another/service/url";
        String bearerToken = getAuthorizationToken();

        HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization", "bearer " + bearerToken);

        HttpEntity entity = new HttpEntity(headers);

        ResponseEntity<TypeOfObjectReturnedByAnotherService> response = restTemplate.exchange(endpoint, HttpMethod.GET, entity, TypeOfObjectReturnedByAnotherService.class);

        return response.getBody();
    }

    private String getAuthorizationToken() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        SimpleKeycloakAccount details = (SimpleKeycloakAccount) authentication.getDetails();

        KeycloakPrincipal<?> keycloakPrincipal = (KeycloakPrincipal<?>) details.getPrincipal();

        RefreshableKeycloakSecurityContext context = (RefreshableKeycloakSecurityContext) getPrincipal().getKeycloakSecurityContext();

        return context.getTokenString();
    }
}

De cette manière, il est possible d’envoyer le jeton valide généré par votre service Origin à un autre service.

1
Fabio HSA

YES - Vous pouvez vous connecter à Application-1 sans utiliser l'interface de connexion keycloak.

Différents adaptateurs client sont disponibles pour y parvenir. Ici, vous n'avez pas mentionné votre travail de cadre d'application.

Pour en savoir plus sur les adaptateurs client Keyclaok: cliquez ici _

Par exemple, si vous choisissez un adaptateur Node.js, vous pouvez suivre le lien suivant: adaptateur node.js

keyCloak Implémentation avec node.js adaptateur, les détails sur les api REST et le mécanisme de validation de jeton sont bien expliqués dans ce lien cliquez pour exemple

0
basith