Keycloak: point final de validation de jeton d’access

L’exécution de keycloak en mode autonome.et créé un micro-service en utilisant l’adaptateur node.js pour l’authentification des appels d’api.

Le jeton jwt du keyclaok envoie avec chaque appel api. il ne répond que si le jeton envoyé est valide.

  • Comment puis-je valider le jeton d’access du micro service?
  • y a-t-il une validation de jeton utilisée par keycloak?

Pour développer la réponse de troger19 :

Question 1: Comment puis-je valider le jeton d’access du micro service?

Implémentez une fonction permettant d’inspecter chaque demande de jeton porteur et d’envoyer ce jeton à des fins de validation par votre serveur keycloak au sharepoint terminaison userinfo avant qu’il ne soit transmis aux gestionnaires de route de votre api.

Vous pouvez trouver les points de terminaison spécifiques de votre serveur de porte-clés (tels que la route userinfo) en demandant sa configuration bien connue .

Si vous utilisez expressjs dans votre api de nœud, ceci pourrait ressembler à ceci:

const express = require("express"); const request = require("request"); const app = express(); /* * additional express app config * app.use(bodyParser.json()); * app.use(bodyParser.urlencoded({ extended: false })); */ const keycloakHost = 'your keycloak host'; const keycloakPort = 'your keycloak port'; const realmName = 'your keycloak realm'; // check each request for a valid bearer token app.use((req, res, next) => { // assumes bearer token is passed as an authorization header if (req.headers.authorization) { // configure the request to your keycloak server const options = { method: 'GET', url: `https://${keycloakHost}:${keycloakPort}/auth/realms/${realmName}/protocol/openid-connect/userinfo`, headers: { // add the token you received to the userinfo request, sent to keycloak Authorization: req.headers.authorization, }, }; // send a request to the userinfo endpoint on keycloak request(options, (error, response, body) => { if (error) throw new Error(error); // if the request status isn't "OK", the token is invalid if (response.statusCode !== 200) { res.status(401).json({ error: `unauthorized`, }); } // the token is valid pass request onto your next function else { next(); } }); } else { // there is no token, don't process request further res.status(401).json({ error: `unauthorized`, }); }); // configure your other routes app.use('/some-route', (req, res) => { /* * api route logic */ }); // catch 404 and forward to error handler app.use((req, res, next) => { const err = new Error('Not Found'); err.status = 404; next(err); }); 

Question 2: Keycloak utilise-t-il une validation de jeton?

Effectuer une demande sur le sharepoint terminaison userinfo de Keycloak est un moyen facile de vérifier que votre jeton est valide.

Userinfo réponse de jeton valide :

Statut: 200 OK

 { "sub": "xxx-xxx-xxx-xxx-xxx", "name": "John Smith", "preferred_username": "jsmith", "given_name": "John", "family_name": "Smith", "email": "[email protected]" } 

Userinfo réponse de jeton valide non valide :

Statut: 401 non autorisé

 { "error": "invalid_token", "error_description": "Token invalid: Token is not active" } 

Information additionnelle:

Keycloak fournit son propre paquet npm appelé keycloak-connect . La documentation décrit une authentification simple sur les itinéraires, exigeant que les utilisateurs soient connectés pour accéder à une ressource:

 app.get( '/complain', keycloak.protect(), complaintHandler ); 

Je n’ai pas trouvé cette méthode fonctionner avec une authentification exclusivement au porteur. D’après mon expérience, la mise en œuvre de cette méthode d’authentification simple sur un itinéraire entraîne une réponse “access refusé”. Cette question demande également comment authentifier une api de repos à l’aide d’un jeton d’access Keycloak. La réponse acceptée recommande d’utiliser la méthode d’authentification simple fournie par keycloak-connect, mais comme Alex le dit dans les commentaires:

“La fonction keyloak.protect () (n’obtient pas) le jeton du porteur à partir de l’en-tête. Je suis toujours à la recherche de cette solution pour l’authentification du porteur uniquement – alex 2 nov. 17 à 14:02

J’utiliserais ce sharepoint terminaison UserInfo pour cela, avec lequel vous pouvez également vérifier d’autres atsortingbuts, tels que le courrier électronique, ainsi que ce que vous avez défini dans les mappeurs. Vous devez envoyer le jeton d’access dans les atsortingbuts d’en-tête avec l’autorisation du porteur: Bearer access_token

http: // localhost: 8081 / auth / realms / demo / protocole / openid-connect / userinfo