2014-10-06 15 views
5

ich Segel ziemlich neu bin, aber nach dem doc lesen und einige Beispiele im Internet gefolgt, habe ich beschlossen, eine Chance zu geben;)Segel REST API mit einfachen AUTH

Ich habe eine APP gemacht, die abhängig auf einem REST-Webservice, den ich im Sails Framework aufbauen möchte - aber nach vielen Recherchen habe ich noch nicht die richtigen Lösungen in den Segeln gefunden.

Ich denke, ich möchte ein (Benutzername, Passwort) oder api_key in jedem Webservice-Anruf aus der App übergeben?

Alle Beispiele, die ich fand, war nur mit einer Sitzung Login-Methode - nicht mit einem API-Schlüssel in jedem Anruf.

benutzen ich diese Tutorial - http://jethrokuan.github.io/2013/12/19/Using-Passport-With-Sails-JS.html

Aber nur Anmeldungen bei Post zur Login-Seite - ich mag es in jedem Gespräch anmelden und will immer noch den Bau in der REST-API Plänen verwenden.

Das Problem in meiner Lösung besteht darin, dass ein Anruf dies mögen - wird mich nicht alle Benutzer als wegen der Standard-REST-Methode erwartet - ich will es den Benutzer auth und geben Sie mir das Ergebnis ..

http://example.com:1337/user/?username=test&password=xxx

Was sind die "Best Practices" für die Erstellung einer APP mit einem REST-Webservice-Backend? - "mit Segeln"

Einige meiner Auth-Code:

// policies/authentication.js 
if(req.param('username') && req.param('password')) { 
    UserAuth.auth(req, res, function(err, user) { 
     if (err) return res.forbidden('You are not permitted to perform this action.'); 

     if(user) { 
     return next(); 
     } 
    }); 
    }else{ 
    return res.forbidden('You are not permitted to perform this action.'); 
    } 

// services/UserAuth.js 

module.exports = { 

    auth : function(req, res, cb) { 

    var bcrypt = require('bcrypt'); 
    var passport = require("passport"); 

    passport.authenticate('local', function(err, user, info){ 

     if (err) return cb({ error: 'auth error!', status: 400 }); 

     if(user) { 
     cb(null, user); 
     } 

    })(req, res); 

    } 
} 

// config/policies.js 
module.exports.policies = { 

    '*': "authentication" 
}; 
+0

Ist das eine Passfrage? Solltest du ihm die Passmarke geben? – Meeker

Antwort

3

Zunächst einmal, es ist eine schlechte Praxis, um kontinuierlich die Benutzernamen und Passwörter in der Wildnis aussetzen wie Dies. Zumindest sollten Sie in Betracht ziehen, access_tokens auszugeben, die nach einiger Zeit ablaufen und über ein Anmeldesystem erneut ausgestellt werden müssen.

Zweitens, wenn Sie jede Anfrage (anstelle von Sitzungen) zur Authentifizierung auf mögen, ist es besser, so zu tun, um einen Request-Header, anstatt die Anmeldeinformationen in dem Query-String setzen. Dies gilt insbesondere für die Verwendung von Sails-Blaupausen. Andernfalls müssen Sie zusätzliche Arbeit an keep the blueprints from using your credentials as search criteria tun.

Wenn Sie eine Kopfzeile verwenden, wird die Autorisierung pro Anfrage mit Sails einfach. Richten Sie eine Politik in api/Politik genannt (zum Beispiel) auth.js:

module.exports = function (req, res, next) { 

    // Find an access header 
    var accessToken = req.header('my-auth-header'); 
    // No header, no access 
    if (!accessToken) {return res.forbidden();} 

    // Find the user with that token 
    User.findOne({accessToken: accessToken}) 
     .exec(function(err, user) { 
     // Handle error 
     if (err) {return next(err);} 
     // Handle bad access token 
     if (!user) {return res.forbidden();} 
     // Handle success 
     return next(); 
     }); 

} 

Dann können Sie alle Controller-Aktionen festgelegt, die eine Authentifizierung verwenden, müssen die config/policies.js file:

module.exports = { 

    SomeController: { 
     '*': 'auth' 
    }, 
    ...etc... 
}