2017-10-16 14 views
0

J'essaie d'implémenter une simple application de démo OAuth2 "Client Authentification avec Signed JWT" en utilisant Spring Boot et Keycloak comme AuthService.Implémentation de JWT, JWE et JWS (JWT signé) avec Keycloak dans Spring Boot

L'idée est:

  1. un service REST sécurisé "Le producteur"
    • offrant un GET/personne de point final pour tous les utilisateurs/directeurs d'école avec le rôle "read_person"
    • offrant un point final POST/personne pour tous les utilisateurs/principaux avec le rôle "write_person"
  2. un autre service (non sécurisé) REST "The Consumer"
    • offrant un enpoint/api ouvert pour tout le monde
    • appelant interne le "producteur" via Feign client en utilisant un RequestInterceptor pour passer le AccessToken (signé JWT/JWS)

Je l'ai lu la docs:

http://www.keycloak.org/docs/latest/securing_apps/topics/oidc/java/client-authentication.html

disant:

Une fois que l'application cliente est lancé, il permet de télécharger sa clé publique> au format JWKS en utilisant une URL telle que http://myhost.com/myapp/k_jwks,> en supposant que http://myhost.com/myapp est l'URL de base de votre client> application. Cette URL peut être utilisée par Keycloak (voir ci-dessous). Pendant l'authentification, le client génère un jeton JWT et le signe avec> sa clé privée et l'envoie à Keycloak dans la requête backchannel particulière> (par exemple, requête code-to-token) dans le paramètre client_assertion>.

Je googlé beaucoup à trouver des tutoriels/démos ou docs sur ce sujet, mais a échoué jusqu'à présent. Voici mes questions:

  1. Comment puis-je mettre ce point de terminaison "k_jwk"? Est-ce que je construis simplement un @RestController par moi-même dans "le producteur"? Comment configurer Keycloak pour prendre connaissance de cette URL?

  2. Comment puis-je implémenter mon "Consumer" pour obtenir un nouveau JWT signé de Keycloak?

Mise à jour REMOVED irritant instruction PS.

+0

Pourquoi vous Réimplémenter tout cela depuis que nous faisons déjà dans l'adaptateur de démarrage Spring? –

+0

S'il vous plaît montrez-moi comment utiliser le Keycloak Adapater ici. Je ne peux pas trouver des démos ou des docs. – HaVonTe

+0

http://www.keycloak.org/docs/latest/securing_apps/topics/oidc/java/spring-boot-adapter.html, consultez également mon blog https://developers.redhat.com/blog/2017/ 05/25/easy-secure-votre-spring-boot-applications-avec-keycloak/ou nos quickstarts https://github.com/keycloak/keycloak-quickstarts –

Répondre

1
  1. Vous n'avez pas besoin de mettre en œuvre le k_jwk point final, cela est géré par l'adaptateur. Keycloak regarde par défaut http:///your.app.com/k_jwk (mais si nécessaire, vous pouvez le remplacer dans la console). Ensuite, vous devez configurer votre client Spring Boot, utilisez simplement les mêmes propriétés que keycloak.json mais dans l'application.format propriétés:

    ...

    keycloak.credentials.jwt.client-keystore-file = classpath: keystore-client.jks keycloak.credentials.jwt.client-keystore-type = JKS

    etc ...

  2. vous avez besoin d'un jeton pour appeler le producer mais comme vous avez dit le point d'entrée sera un point final insecured vous pourriez donc vouloir utiliser un Service Account pour cela.

J'espère que cela aidera.

+0

Ok, merci. Le premier Info est très pratique. Je vais essayer de comprendre et de mettre en œuvre ce sujet de compte de service. – HaVonTe

+0

Je pourrais avoir besoin d'aide supplémentaire ici. Je configure une application client avec les paramètres KeyCloak appropriés et l'adaptateur dans les dépendances de Gradle.J'ai créé un client Feign (RestTemplate serait bien aussi pour moi). Maintenant quoi? Comment générer un JWT? Je ne comprends pas l'indice avec le compte de service. Le document dit: http://www.keycloak.org/docs/2.5/server_admin/topics/clients/oidc/service-accounts.html Résumé: récupérez le jeton de keycloak par POST/auth/realms/demo/protocol/openid-connect/jeton alors je dois écrire ceci par myselft? – HaVonTe

+0

Oui, si vous voulez utiliser un JWT signé comme authentification client, il y a probablement du travail manuel à faire, mais vous pourriez tirer parti de cette classe pour obtenir le jeton jwt https://github.com/keycloak/keycloak/blob/master/ adaptateurs/oidc/adaptateur-core/src/principal/java/org/keycloak/adapteurs/authentification/JWTClientCredentialsProvider.java –

0

Mise à jour

Je ne pourrais pas résoudre ce problème, mais a appris certaines choses sur singned JWT dans le même temps:

  1. créer un soi-disant "Bearer Token" en créant une structure JSON avec toutes les revendications nécessaires (sub, nbf, exp ...) par vous-même et signe/certificat avec votre JKS/clé privée de Keycloak. À côté de Keycloak, il y a de bonnes bibliothèques tierces.

  2. Pour obtenir un vrai AccessToken (JWE/JWS) de Keycloak: envoyer cette dernière statique Bearer jeton à Keycloak à /auth/domaines/royaume $/protocole/openid-connexion/jeton/introspect

avec QueryParams:

grant_type = client_credentials & client_assertion_type = urn% 3Aietf% 3Aparams% 3Aoauth% 3Aclient affirmation de type% 3Ajwt porteur & client_assertion = BEARER_TOKEN $

  1. Utilisez le AccessToken réel reçu pour accéder au ResourceServer ...