2017-10-15 1 views
1

UPDATEExpress Session Eigenschaft unterscheidet zwischen Browser und Postman

Ich denke, es wert ist zu erwähnen, ich Angular CLI bin mit der auf dem Port läuft 4200 und mein Server läuft auf Port 8080 könnte dies ein Problem sein? Es ist die einzige Sache, die ich im Moment

Wenn ich einen Aufruf an meine Route '/ Auth/Login' Ich habe eine protokollierte Eigenschaft für das Session-Objekt. Um zu überprüfen, ob ein Benutzer authentifiziert ist, wird eine Anfrage an '/ auth/checktoken' gestellt. Hier überprüfe ich das Vorhandensein der Eigenschaft loggedIn für das Objekt req.session. Wenn ich diese Anfragen in Postman mache, funktioniert alles einwandfrei, aber wenn ich den Browser benutze, ist meine Eigenschaft session.loggedIn nicht definiert. Ich werde den entsprechenden Code unten einfügen. Vielen Dank im Voraus für jede Hilfe

Server Side

router.get('/checktoken', (req, res) => { 
    if(!req.session.loggedIn) { 
    return res.status(401).send({ 
     userTitle: 'Not authorised', 
     userMessage: 'You are not authorised to view this' 
    }) 
    } 

    return res.status(200).send() 
}) 

Client Side

@Injectable() 
export class CheckAuthenticationService implements CanActivate { 
    constructor(
    private router: Router, 
    private http: HttpClient) { } 

    canActivate() { 
    this.http.get('http://localhost:8080/auth/checktoken', { responseType: 'text' }) 
     .toPromise() 
     .then(() => { 
     this.router.navigate(['admin']); 
     }) 
     .catch(() => { 
     this.router.navigate(['login']); 
     }); 

    return true; 
    } 
} 

Snippet von Login-Code, der die LoggedIn Eigenschaft

if (user) { 
    user.comparePassword(password, (err, isMatch) => { 
    if (isMatch && isMatch) { 
     req.session.loggedIn = user; 
     res.status(200).send() 
    } else { 
     res.status(404).send({ 
     userTitle: 'Wrong password', 
     userMessage: 'Please make sure your password is correct' 
     }); 
     } 
    }); 
    } 
setzt

Session Shop Setup

app.use(session({ 
    name: 'jack-thomson', 
    secret: SECRET_KEY, 
    saveUninitialized: false, 
    resave: true, 
    store: new MongoStore({ 
    mongooseConnection: mongoose.connection 
    }) 
})) 

Dies alles funktioniert in Postman aber wenn diese Endpunkte auf dem Client schlagen, .loggedIn nicht definiert ist, immer

Antwort

0

Sind Sie mit CORS?

hatte ich das gleiche Problem, und ich löste es in jeder Anfrage { withCredentials: true } als optionale Argumente, indem. Ich meine, wann immer Sie eine http/https Anfrage in Ihrem Dienst senden, setzen Sie dies als letztes Argument, und Sie sind gut zu gehen.

Sie können this und this Stackoverflow Frage für weitere Informationen zu dem Thema lesen.

+0

Ich habe das versucht :(Und ja ich verwende eine CORS Middleware in meinem Node-Server – Jackthomson

+0

Yo muss dies in jeder Anfrage hinzufügen, und folgende ist ein Ausschnitt meiner Middleware verwenden, wenn es Ihnen helfen kann 'app.use (CORS ({ \t Herkunft: 'http: // localhost: 4200', \t Anmeldeinformationen: true })); app.use (Session ({ \t Name: 'connect.sid', \t Httponly: wahr, \t Geheimnis: process.env.SESSION_KEY, \t Resave: false, \t saveUninitialized: true, \t Geschäft: neuer MongoStore ({mongooseConnection: mongoose.Verbindung}) })); ' –

+0

Vielen Dank Mann, aber es funktioniert überhaupt nicht:/Ich bin mir nicht sicher, ob es um meinen Server geht, der auf einem anderen Port als die eckige Anwendung läuft. Die eckige App läuft auf Port 4200 und mein Server läuft auf 8080 – Jackthomson

1

ich habe endlich herausgefunden, was los ist. Mein Angular CLI lief auf 4200 und mein Server lief auf einem separaten Port. Ich bin über das Problem mit der Bearbeitung meiner Bewerbung mit Express gekommen, also ist es alles nur eine Route. Das hat das Problem für mich gelöst. Wenn jemand damit kommt, hoffe ich, dass diese Information für Sie nützlich ist!

Verwandte Themen