web-dev-qa-db-fra.com

AngularJS - Gérer le jeton d'actualisation?

Je construis un SPA avec AngularJS avec communication vers un service (Java).

Lorsque l'utilisateur envoie son nom d'utilisateur/passe, le service renvoie les deux: jeton d'accès et jeton d'actualisation. J'essaie de gérer: si j'obtiens une réponse avec le statut 401, renvoyez le jeton d'actualisation, puis renvoyez votre dernière demande. J'ai essayé de le faire en incluant $ http, mais angular ne me laisse pas l'inclure dans cet intercepteur. Y a-t-il un moyen de recréer la demande d'origine avec ce paramètre de réponse que je reçois?

Quelque chose comme:

  1. Je reçois 401
  2. enregistrer ma demande
  3. si j'ai un jeton d'actualisation envoyer ce jeton d'actualisation
  4. en cas de succès renvoyer ma demande
  5. en cas d'erreur, rediriger vers/page de connexion

    'use strict';
    
    angular.module('testApp')
        .factory('authentificationFactory', function($rootScope, $q, $window, $location, CONF) {
    
    return {
        request: function(config) {
            config.headers = config.headers || {};
            if ($window.sessionStorage.token) {
                config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
            }
            console.log(config);
            $rootScope.lastRequest = config;
            return config;
        },
    
        response: function(response) {
            console.log($rootScope.lastRequest);
            if (response.status === 401) {
                if ($window.sessionStorage.refreshToken) {
    
                    //Save, request new token, send old response
                    //if it fails, go to login
    
                    $location.url('/login');
                } else {
                    $location.url('/login');
                }
            }
            return response || $q.when(response);
        }
    };
    });
    

Question bonus (la question principale est plus importante): il y a 2 applications mobiles qui se connecteront également à mon service, et lorsque je me connecte depuis mon application web, et quelques instants plus tard depuis mon application mobile, l'application mobile prend un nouveau jeton de rafraîchissement et le jeton d'actualisation de mon application Web n'est plus valide. Quelle serait la meilleure option pour y faire face?

Merci pour votre temps, Meilleures salutations

22
DyslexicDcuk

Jetez un œil à ceci: https://github.com/witoldsz/angular-http-auth .

Il utilise un tampon pour rejouer les demandes après l'authentification.

12
Sam

Je déconseille fortement de ne pas envoyer et stocker des jetons de rafraîchissement sur des SPA comme Angular.

Si vous utilisez le stockage de session ou le stockage local, vous ouvrez une fenêtre d'opportunité pour que ce refreshToken soit capturé, soit par une attaque XSS, soit par l'utilisateur laissant l'ordinateur sans surveillance.

Voir cet article ou cette question pour plus d'informations.

5
amaurymartiny