Wie strukturiere ich einen Knoten, Express-, Connect-Auth- und Backbone-Anwendungen auf der Serverseite?

StackOverflow https://stackoverflow.com/questions/7814794

Frage

Ich bin ein kundenseitiger Typ, der gerade in die Welt des serverseitigen JavaScript eingetreten ist. Ich habe diese Idee, wie ich denke, ich möchte meine erste NodeJS -Anwendung erstellen. Ich möchte eine serverseitige Seite, die so gut wie nur eine leere Hülle und viel JSON serviert. Ich möchte den Rest der Logik in ein Backbone stecken.

Also habe ich schnell eine kleine Anwendung (Code unten) gepeitscht und habe ein paar Fragen.

  1. Sind Sitzungsvariablen sicher? Kann ich Sitzungsvariablen verwenden, um eine Benutzerkennung zu speichern, die ich später gelesen habe, um das sensible Datum abzurufen? Ist es möglich, Sitzungsvariablen zu ändern, damit ein Benutzer in meinem Fall die Daten eines anderen Benutzers erhalten kann?

  2. Ist es sinnvoll, JSON so zu dienen, wie ich es auf meiner '/Profil' -Route mache? In meiner Bewerbung gibt es so viele Routen. Routen, die etwas aus der Datenbank holen und sie als JSON dem Client bedienen.

  3. Haben Sie Tipps oder Tricks? Dinge, die ich anders machen sollte. Module, die ich mir wahrscheinlich ansehen sollte?

  4. Ist meine Idee eines fast JSON-Backends sinnvoll?

Meine Bewerbung unten.

var facebook = {
    'appId'         : "my app id",
    'appSecret'     : "my app secret",
    'scope'         : "email",
    'callback'      : "http://localhost:2000/"
}

var express         = require('express');
var MongoStore      = require('connect-mongo');
var auth            = require('connect-auth')
var UserProvider    = require('./providers/user').UserProvider;
var app             = module.exports = express.createServer();

// Configuration
app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser());
    app.use(auth([auth.Facebook(facebook)]));
    app.use(express.session({secret: 'my secret',store: new MongoStore({db: 'app'})}));
    app.use(express.compiler({ src: __dirname + '/public', enable: ['less'] }));
    app.use(app.router);
    app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
    app.use(express.errorHandler()); 
});


// Providers
var UserProvider = new UserProvider('localhost', 27017);

// Routes
app.get('/', function( request, response ) {

    if( !request.session.userId ) {
        request.authenticate(['facebook'], function(error, authenticated) {
            if( authenticated ) {
                request.session.userId = request.getAuthDetails().user.id;
            }
        });
    }

    response.render( 'index.jade' );

});

app.get('/profile', function( request, response ) {

    response.contentType('application/json');
    if( request.session.userId ){
        UserProvider.findById( request.session.userId, function( error, user ){
            var userJSON = JSON.stringify( user );
            response.send( userJSON );
        });
    } else {
        response.writeHead(303, { 'Location': "/" });
    }

});

app.get('/logout', function( request, response, params ) {

    request.session.destroy();
    request.logout();
    response.writeHead(303, { 'Location': "/" });
    response.end('');

});

app.listen(2000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
War es hilfreich?

Lösung

Ich denke, Sie haben die richtige Idee, obwohl ich ein paar Gedanken wegwerfen werde:

  • Routen definieren - Wenn Sie viele Routen definieren, insbesondere bei JSON, möchten Sie sie möglicherweise über ein MVC -Typ -Framework dynamisch definieren. Sie können ein gutes Beispiel dafür finden In den Expressproben hier. Es würde Ihnen viele handgeschriebene Routen ersparen und Sie könnten Knotenobjekte als JSON an den Client weitergeben, ohne viel anderes auf der Serverseite zu tun.
  • Rückgrat auf dem Server - Wenn Sie ein wenig verrückter werden möchten (und ich habe diese Technik nie verwendet), Entwicklungssamen einen Rahmen gebaut haben, der genannt wird Knochen das Verwendet das Rückgrat auf der Serverseite.
  • Login -Beispiel - Es gibt Ein gutes Tutorial bei DailyJS In Bezug auf die Verwaltung der Benutzersitzung.
  • Barrierefreiheit - Solange Sie keine Barrierefreiheitsprobleme haben, ist die Bereitstellung von Daten über eine REST -API sinnvoll. Wenn Sie sich um 508 Einhaltung oder andere JavaScript -Einschränkungen sorgen müssen, können Sie Probleme haben.

In Bezug auf die Sicherheit würde das Festlegen Ihrer Sitzungszeitüberschreitung auf einen niedrigeren Wert und die Auswahl eines geeigneten geheimen Schlüssels wahrscheinlich einen großen Beitrag dazu leisten, sicherzustellen, dass jemand Session Cookies nicht generieren kann (standardmäßig werden die tatsächlichen Daten nicht auf dem Client gespeichert). Ich bin mir nicht sicher, was mit Algorithmus Node.js Session Cookies generiert. Hier sind einige Details zur Express Session Middleware.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top