2016-10-19 2 views
0

Ich arbeite an dem Authentifizierungssystem für eine Knoten-App. Die Anmeldeseite sendet eine AJAX-Anforderung an den Authentifizierungsendpunkt, und der Endpunkt fragt dann unsere Benutzerdatenbank ab, um die Gültigkeit der Anmeldeinformationen zu ermitteln. Wenn der Endpunkt feststellt, dass die Anmeldeinformationen gültig sind, verwende ich die Methode res.cookie() von Express, um auf der Clientseite ein Cookie zu erstellen, das die Authentifizierungsinformationen für spätere Anforderungen enthält.Warum wird der Set-Cookie-Header nicht gesendet? - Verwenden Restify

Die Authentifizierung funktioniert gut, und die Antwort wird zurück an den Benutzer gesendet, aber wenn ich in den Entwicklertools sehe, sehe ich keine authorization Cookie, und keine Erwähnung einer Set-Cookie Header. Was gibt?

Weitere Informationen:

Headers auf die Antwort

restify.CORS.ALLOW_HEADERS.push('Accept-Encoding'); 
restify.CORS.ALLOW_HEADERS.push('Accept-Language'); 
restify.CORS.ALLOW_HEADERS.push('authorization'); 
restify.CORS.ALLOW_HEADERS.push('token'); 
server.use(restify.CORS({ 
    origins: ['*'], 
    credentials: true, 
    headers: ['token'] 
})); 

/* break */ 

server.opts(/\.*/, function (req, res, next) { 
    res.header('Access-Control-Allow-Credentials', true); 
    res.header('Access-Control-Allow-Headers', restify.CORS.ALLOW_HEADERS.join(', ')); 
    res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); 
    res.header('Access-Control-Allow-Origin', res.headers.origin); 
    res.header('Access-Control-Max-Age', 0); 
    res.header('Content-type', 'text/plain charset=UTF-8'); 
    res.header('Content-length', 0); 
    res.send(200); 
    next(); 
}); 

Relevante Teil der Authentifizierung api

function authHandler(req, res, next) { 

    authMan.authenticate(req.params.username,req.params.password).then(function(userdata){ 
    /*d*/console.log('userData:'+userdata); 
    // jwt library for JSON web tokens 
    const authorization = jwt.sign(
     {'sub': userdata.username, 'roles': authMan.getGroups(userdata)}, 
     // global 
     authSecret, 
     {issuer:'myCompany.com'} 
    ); 

    // Only send the client the user's username and display name 
    var strippedData = {}; 
    strippedData.username = userdata['username']; 
    strippedData.displayName = userdata['displayName']; 
    // Disable https when not in prod 
    var useHttps = true; 
    if (process.env[NODE_ENV] === 'dev') { 
     useHttps = false; 
    } 
    res.cookie('authorization', authorization, { 
     httpOnly: true, 
     secure: useHttps 
    }); 
    /*d*/console.log('Sent the request back!'); 
    res.send({ 
     status: 'OK', 
     userdata: strippedData 
    }); 
    next(); 
    },function(err){ 
    /*d*/console.log('authHandler error: '+err); 
    res.status(401).send({ 
     status: 'ERROR', 
     error: err 
    }); 
    next(); 
    }); 
    metrics.log(etc); 
    next(); 
} 

Sie, dass in dem obigen Code sieht, gibt es eine Debug-printf Spruch "Die Anfrage wurde zurückgeschickt!" Während die Antwort an den Server gesendet wird und den richtigen Inhalt enthält, wird diese Anweisung nie in meiner Konsole angezeigt, obwohl sie vor res.send() erscheint.

Antwort

0

Nach Prüfung und Hilfe von meinen Kollegen war das Problem, dass res.cookie() nicht definiert war. Ich habe es irgendwie in den Kopf bekommen, dass restify.js, der Server, den wir benutzen, ein Superset von express.js war. Es ist nicht! Die Funktion, die ich hätte verwenden sollen, ist res.setCookie().

+0

Vielen Dank für Ihre Rückkehr. Wenn es Ihr Problem tatsächlich gelöst hat, akzeptieren Sie Ihre eigene Antwort, damit andere wissen, dass es eine Lösung gibt. – HeadCode

Verwandte Themen