2014-10-06 15 views
5

Sono abbastanza nuovo per le vele, ma dopo aver letto il documento e seguito alcuni esempi a Internet, ho deciso di dare un colpo;)Sails REST API con semplice AUTH

ho fatto un app che dipendono su un webservice REST che voglio costruire in Sails Framework - ma dopo molte ricerche non ho ancora trovato le giuste soluzioni in vele.

Penso di voler passare un (nome utente, password) o un api_key in ogni chiamata al servizio web effettuata dall'app?

Tutti gli esempi che ho trovato erano solo con un metodo di login di sessione - non con una chiave API in ogni chiamata.

Ho usato questo tutorial - http://jethrokuan.github.io/2013/12/19/Using-Passport-With-Sails-JS.html

Ma solo gli accessi a livello post alla pagina di login - Voglio che accedi al sito per ogni chiamata e ancora voglia di utilizzare la configurazione in REST API progetti.

Il problema nella mia soluzione è che una chiamata a come questo - non mi darà tutti gli utenti come previsto a causa del metodo di default REST - voglio che Auth l'utente e mi danno il risultato ..

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

Quali sono le "migliori pratiche" per la creazione di un'APP con un backend webservice REST? - "con le vele"

Alcuni del mio codice di autenticazione:

// 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

È questo una domanda sul passaporto? Dovresti dargli il passaporto? – Meeker

risposta

3

Prima di tutto, si tratta di cattiva pratica di esporre in modo continuo i nomi utente e le password in natura come Questo. Per lo meno, dovresti prendere in considerazione l'emissione di access_tokens che scadono dopo un po 'di tempo e devono essere nuovamente emessi tramite un sistema di accesso.

In secondo luogo, se si desidera eseguire l'autenticazione su ogni richiesta (invece di utilizzare le sessioni), è meglio farlo utilizzando l'intestazione di richiesta , anziché inserire le credenziali nella stringa di query. Questo è particolarmente vero quando si usano i progetti di Sails; altrimenti dovrai fare un lavoro extra su keep the blueprints from using your credentials as search criteria.

Quando si utilizza un'intestazione, l'autorizzazione per richiesta diventa semplice con Sails. Impostare una politica in API/politiche chiamati (per esempio) 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(); 
     }); 

} 

quindi è possibile impostare eventuali azioni di controllo che hanno bisogno di autenticazione utilizzando il config/policies.js file:

module.exports = { 

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