2017-01-25 1 views
0

Ich habe durch dieses Tutorial https://thinkster.io/tutorials/mean-stack/creating-an-angular-service-for-authentication gearbeitet. Ich erhalte den Fehler 'konnte nicht atob auf Fenster ausführen'. Ich bin ziemlich sicher, dass der Fehler innerhalb der Auth-Fabrik ist, insbesondere die auth.isLoggedIn-Funktion, ich habe console.log die Antwort vom Server und kopiere und steckte das Token in jwt.io und es überprüft, wie es sein soll. Mit der Dekodierfunktion stimmt also etwas nicht. Ich habe versucht, $window.atob zu erforschen, um das zu verstehen und richtig zu debuggen, aber ich verstehe nicht. Das jwt.sign in meinem userSchema hat keine Funktion namens .btoa verwendet. Obwohl das Tutorial sagt, dass .atob zum Decodieren verwendet werden soll, scheint das nicht richtig zu sein. Wie dekodiere ich das Token in meiner eckigen Fabrik, um in dieser Payload-Variable zu speichern?'Atob auf Fenster konnte nicht ausgeführt werden' unsicher, ob es die Nutzlast schreiben oder die Funktion es zu decodieren

var payload = JSON.parse($window.atob(token.split('.')[1])); 

Angular App Datei

app.factory('auth', ['$http', '$window', function($http, $window){ 
    var auth = {}; 

auth.saveToken = function(token){ 
    $window.localStorage['rawle_news_app'] = token; 
}; 

auth.getToken = function(){ 
    return $window.localStorage['rawle_news_app']; 
} 

auth.isLoggedIn = function(){ 
    var token = auth.getToken(); 

    if(token){ 
     var payload = JSON.parse($window.atob(token.split('.')[1])); 

     return payload.exp > Date.now()/1000; 
    }else{ 
     return false; 
    } 
}; 

auth.currentUser = function(){ 
    if(auth.isLoggedIn()){ 
     var token = auth.getToken(); 
     var payload = JSON.parse($window.atob(token.split('.')[1])); 

     return payload.username; 
    } 
}; 

auth.register = function(user){ 
    return $http.post('/register', user).then(function(data){ 
     auth.saveToken(data.token); 
    }); 
}; 

auth.logIn = function(user){ 
    return $http.post('/login', user).then(function(data){ 
     auth.saveToken(data.token); 
    }); 
}; 

auth.logOut = function(){ 
    $window.localStorage.removeItem('rawle_news_app'); 
}; 

    return auth; 
}]) 

Antwort

0

Ich werde die Lösung für den Fall, jemand anderes schreiben hat dieses Problem, aber es stellt sich heraus, es ist nichts falsch mit dieser dekodieren Aussage war aber tatsächlich in der Einsparung das Token in $ window.localStorage. Sie können oben sehen, dass ich Daten anstelle der Antwort verwendet habe, was mich glauben ließ, dass data.token der korrekte Pfad zum Token war, aber wenn Sie das Protokoll loggen, sehen Sie, dass Daten auch ein Feldname sind. Also hätte ich data.data.token benutzen müssen. Also, während ich mich ziemlich dumm fühle, werde ich das hier für den Fall aufschreiben, dass jemand anderes Probleme mit dem Tutorial hat, um sicherzustellen, dass sie so etwas wie ihre Registerfunktion haben.

auth.register = function(user){ 
     return $http.post('/register', user).then(function(response){ 
      auth.saveToken(response.data.token); 
     }); 
    }; 
Verwandte Themen