2016-09-30 1 views
1

私はルートがヒットする前に実行されるメカニズムを実装しようとしています。この仕組みでは、ヘッダーから値を取り出し、認証を確認したいと考えています。Hapi.js - すべてのルートを確認するためのメカニズムを追加する

私はこれが出ている

: server.js:

// Create a server with a host and port 
'use strict'; 

var Hapi = require('hapi'); 
var mongojs = require('mongojs'); 

var plugins = [  
    require('./routes/entities') 
]; 
var server = new Hapi.Server(); 
server.connection({ 
    port: 3000 
}); 
//Connect to db 
server.app.db = mongojs('hapi-rest-mongo', ['entities']); 

server.app.checkHeader = function (request) { 
var header = request.headers['x-authorization']; 
if(header === "letmein"){ 
    return true 
} 
return false 
}; 
    //Load plugins and start server 
server.register(plugins, function (err) { 

if (err) { 
    throw err; 
} 

// Start the server 
server.start(function (err) { 
    console.log('Server running at:', server.info.uri); 
    }); 
}); 

とroutes.entitiesで:

'use strict'; 

var Boom = require('boom'); 
var uuid = require('node-uuid'); 
var Joi = require('joi'); 

exports.register = function (server, options, next) { 

var db = server.app.db; 

server.route({ 
    method: 'GET', 
    path: '/entities', 
    handler: function handler(request, reply) { 

     if(!server.app.checkHeader(request)) 
     { 
      return reply(Boom.unauthorized()); 

     }; 

     //request.server.myFunc(); 
     db.entities.find(function (err, docs) { 

      if (err) { 
       return reply(Boom.wrap(err, 'Internal MongoDB error')); 
      } 

      reply(docs); 
     }); 
    } 
}); 

をそう簡単に言えば、私は私の機能サーバーを登録したサーバの起動時に.app.checkHeader

そして私はそれを呼び出してrそれにはがあります。 Requestオブジェクトには、ヘッダーに関する情報が含まれます。

これは機能しますが、私はHapiのベストプラクティスに従わないと感じています。

私はもっと上品にそれを行うことができますか?

+2

フック?たとえばonPreHandlerです。 http://hapijs.com/api#request-lifecycleを参照してください。この場合、Hapi独自の認証機能を使用する方が良いと思います。 – estus

+0

戦略を導入する例https://github.com/hapijs/hapi-auth-cookie/blob/master/lib/index.js – Rabea

+0

私はすでにそれを実装しています。これは私がヘッダーに必要なものです。 –

答えて

2

すべてのルートまたは選択されたルートに対して認証を要求する最善の方法は、hapiの統合機能を使用することです。

各ルートハンドラに適用されるset a default authentication strategyです。以下のサンプルでは、​​基本認証を使用しています。 hapiがx-authenticationヘッダーを確認するためのカスタム認証戦略を作成する必要があります。

const Hapi = require('hapi') 
const BasicAuth = require('hapi-auth-basic') 
const server = new Hapi.Server() 

server.register(BasicAuth, function (err) { 
    if (err) { 
    console.log('error', 'failed to install plugins') 
    throw err 
    } 

    // TODO: add authentication strategy & set as default 
    server.auth.strategy('simple', 'basic', true, { validateFunc: basicValidationFn }) 

    // or set strategy separately as default auth strategy 
    server.auth.strategy('simple', 'basic', { validateFunc: basicValidationFn }) 
    server.auth.default('simple') 


    // TODO: add routes 

    server.start(function (err) { 
    }) 
}) 

また、所定の時点でhapi’s request lifecycle and extend itを注入することもできます。リクエストのライフサイクルを延長することはusing pluginsによって行われるべきである:助け

register: function (server, options, next) { 
    // do some processing before 'onPreAuth' 
    // or pick another extension point 
    server.ext('onPreAuth', (request, reply) => { 
    // your functionality 
    }) 
} 

願っています!

2

いくつかのオプションがあります。

もちろん、request lifecycleに入ることができます - ルートハンドラの前にパイプラインで発生するイベントに注意してください。

ただし、すべてのルートのデフォルトとして、または適切なルートに選択的に設定できる認証戦略の実装を検討することをお勧めします。

関連する問題