2017-03-23 3 views
1

ich eine Anmeldung mit folgenden Code authentifizieren:Angular 2: beobachtbare nur zurückkehrt "false"

auth.service.ts

import { User } from './user.interface'; 
import { Http, Response } from '@angular/http'; 
import { Injectable } from '@angular/core'; 
import { Router } from '@angular/router'; 
import { Subject } from 'rxjs/Subject'; 

@Injectable() 

export class AuthService { 

    token: any; 
    currentUser: any; 

    constructor(private router: Router, private http: Http) { 
    this.currentUser = JSON.parse(localStorage.getItem('currentUser-hb')); 
    } 
isAuthenticated() { 
     const state = new Subject<any>(); 

     if (this.currentUser != null) { 
     const token = this.currentUser.token; 
     const body = JSON.stringify({token: token}); 
     return this.http.post('https://test.de/validatetoken', body) 
      .map((response: Response) => { 
      const authResponse = response.json().response; 
      if (authResponse) { 
       state.next(true); 
       alert('Valid Token'); 
      } else { 
       state.next(false); 
       alert('No valid Token'); 
      } 
      return state.asObservable(); 
      }); 
     }... 

navigation.component.ts

isAuthenticated: any = false; 
    constructor(private authService: AuthService, private router: Router) { 
    this.authService.isAuthenticated().subscribe(
     data => console.log(data) 
    ); 
    if (this.isAuthenticated !== false) { 
     this.router.navigate(['']); 
    } 
    } 

Der Auth.service warnt, wenn die aktuelle Token ist gültig oder nicht. Aber das Observable kehrt jedes Mal "falsch" zurück, obwohl das Token gültig ist. Ich kann den Fehler nicht finden.

Antwort

1

Wäre es ein Grund, warum Sie Subject hier verwenden? Warum nicht einfach true oder false zurückgeben? Sie sind auf die Antwort der abonnieren, so, wenn isAuthenticated() gefeuert, werden Sie die Antwort in Ihrem Abonnement erhalten ... so versuchen:

isAuthenticated() { 
    return this.http.post('https://test.de/validatetoken', body) 
    .map((response: Response) => { 
     const authResponse = response.json().response; 
     if (authResponse) { 
      return true; 
     } else { 
      return false; 
     } 
    }) 
    } 

und Komponente, vielleicht die Methode in OnInit Feuer, aber ich habe den Konstruktor hier verwendet wie du hast.

isAuthenticated: any = false; 

constructor(private authService: AuthService, private router: Router) { 
    this.authService.isAuthenticated() 
     .subscribe(data => { 
     this.isAuthenticated = data; 
     // check value of isAuthenticated inside subscription! 
     if (this.isAuthenticated !== false) { 
      this.router.navigate(['']); 
     } 
     }); 
    } 
+0

Vielen Dank! :) Ich habe ein Thema verwendet, weil der Code von einem Kurs stammt, aber die Authentifizierung war über Firebase. – Harvix

+0

Nur eine Frage. Wenn ich eingeloggt bin, der Code 'this.router.navigate (['']); 'nicht funktionieren, aber Winkel wirft keinen Fehler. Weißt du, wie man das löst? – Harvix

+0

Hmm ... Schwer zu sagen mit diesem kleinen Code und nicht wissen, wie Ihr Routing aussieht. Scheint aber wie eine Art Routing-Problem. – Alex

0

isAuthenticated: any = false; Konstruktor (privater authService: AuthService, privater Router: Router) {this.authService.isAuthenticated(). subscribe (Daten => {console.log (Daten); this.isAuthenticated = Daten; if (this.isAuthenticated! == false) {this.router.navigate (['']);}})}

Nicht getestet, aber dies wird Ihr Problem lösen.

0

Dies lief synchron, FYI:

if (this.isAuthenticated !== false) { 
    this.router.navigate(['']); 
} 

So müssen Sie diesen Code in das Abonnement auszuführen, nachdem Sie, ob die Auth gearbeitet bestimmt haben. Ich bin mir nicht sicher, warum Ihr Token nicht zurückkehrt. Ich würde den Network Tab/Server Debugger betrachten, um das herauszufinden.

+0

Mein Token wird zurückgegeben, aber das Oservable gibt nur false zurück. Die aufgerufene Http-Datei gibt nur wahr oder falsch zurück. – Harvix

Verwandte Themen