J'ai 2 applications différentes: dire Application1 et Application2 .
J'ai intégré Application2 avec keycloak et je peux me connecter à cette application à l'aide de la page de connexion de Keycloak.
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
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
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.
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.
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