node.js - tutorial - npm




empêcher un accès direct aux fichiers en utilisant AngularJs et Node.js/Express (2)

Faire une requête dans AngularJS pour le chemin /foo/bar revient à entrer l'URL domain.com/foo/bar .

Vous ne pouvez pas empêcher l'un et permettre l'autre parce qu'à la fin - ce sont des demandes au serveur.

Ce que vous pouvez cependant faire est d'empêcher les demandes non autorisées en utilisant un middleware. Par exemple, uniquement si l'utilisateur est administrateur ou seulement si l'utilisateur s'est connecté.

Ainsi, dans votre serveur, vous pouvez écrire un code tel que:

function ensureAuthenticated (request, response, next) {
    //Custom code - If request is authenticated
    return next();
    //if Not
    res.send(403, "Forbidden");
};

app.get('/public/albums', ensureAuthenticated, function (req, res) {
    //res.sendfile(filepath);
});

En utilisant Angular et Node.js / Express, existe-t-il un moyen d'empêcher un accès direct à mes fichiers .html partiels tout en permettant la gestion des routes suivantes:

Mes routes angulaires ressemblent à ceci:

$stateProvider.state('albums', {
  url: '/albums',
  templateUrl: '/public/albums',
  controller: 'AlbumsCtrl'
});

alors mon application express fait ce qui suit:

app.get('/public/albums', function(req, res){
  res.sendfile('views/partials/albums.html');
});

Tout fonctionne bien, mais en tapant "mysite.com/public/albums" permet un accès au fichier partiel .html. Il n'y aurait toujours rien à voir car le contenu est chargé séparément et l'utilisateur devrait être connecté pour cela, mais j'aimerais quand même empêcher l'accès à ce fichier.


Vous avez probablement trouvé une réponse ou une méthode différente, mais si vous voulez faire quelque chose comme ça, il y a une solution:

L'idée

Vous pouvez utiliser le httpRequestInterceptor pour ajouter un en-tête personnalisé à toutes les requêtes provenant d'angular. Du côté serveur, vous pouvez simplement vérifier si la requête contient cet en-tête. Si ce n'est pas le cas, vous pouvez rediriger ou envoyer un message d'erreur.

Le code

Côté client (Angularjs):

Créer un intercepteur:

myApp.factory('httpRequestInterceptor', function () {
    return {
        request: function (config) {
            config.headers['x-custom-header-name'] = 'something'
            return config
        }
    }
});

Ajoutez l'intercepteur aux intercepteurs $ httpProvider:

myApp.config( function ($httpProvider) {
    $httpProvider.interceptors.push('httpRequestInterceptor')
});

Côté serveur (node.js)

Au moment où vous voulez commencer à éviter l'accès direct, il suffit de mettre ce code:

app.use(function (req, res, next) {
    if (!req.headers['x-custom-header-name']) {
        res.redirect('/'); //Or just do what you want to
    }
    next();
});

Ou si vous voulez éviter l'accès sur un ou plusieurs itinéraires, vous pouvez modifier le code en changeant

app.use(function (req, res, next) ...

avec

app.use( 'route/no-direct-access', function (req, res, next) ...

Le code de l'intercepteur provient de cette question :

Définition d'en-têtes HTTP étendus dans AngularJS

J'espère que cela peut aider quelqu'un! Au revoir!





routing