2015-02-11 67 views
0

我們使用Hapi JS爲我們的其餘服務器。我們爲Redis上的用戶存儲身份驗證令牌。現在,如果由於某種原因節點與Redis失去連接,我們需要將401 Authorization failed錯誤返回給所有路由中的所有客戶端,以便客戶端可以自動註銷。爲hapijs返回所有路由的401錯誤

那麼,有沒有辦法在不改變路由處理函數代碼的情況下從所有路由返回401?

+0

你可以[刪除所有的路線映射](http://stackoverflow.com/questions/10378690/remove-route-mappings-in-nodejs-express/28369539#28369539)並插入一個新的? – laggingreflex 2015-02-11 21:17:39

+0

對不起,無法準確理解刪除所有映射的好處。我想我需要一箇中間件來實現這一點。至少我需要hapijs中的中間件等價的機制。 – 2015-02-11 21:37:24

+0

目前爲止,您如何進行身份驗證? 如果您使用hapi認證機制,則應該發生這種情況...... – 2015-02-12 10:53:51

回答

0

您可以使用Hapi server extension event'onRequest'

var hapi = require('hapi'); 
var Boom = require('boom'); 

var server = new hapi.Server(); 
//Configure your server 

//Add an extension point 

server.ext('onRequest', function (request, reply) { 
    var status; 
    //Check status of redis instance 

    if (status) { 
     //Redis is running, continue to handler 
     return reply.continue(); 
    } else { 
     //Redis is down, reply with error 
     return reply(Boom.unauthorized('Auth server is down')); 
    } 
}); 

這可能不是你如何驗證你的redis實例的狀態,但我希望你明白了。

可以查找各種其他擴展點here

+0

是的,這正是我所做的。 – 2015-02-25 12:58:32

0

您應該在應用程序使用的auth插件中執行此操作。看看hapi-auth-basic的實現:https://github.com/hapijs/hapi-auth-basic/blob/master/lib/index.js

如果你看看這個方案,你必須定義一個認證方法,它接受請求和回覆。這是你應該檢查認證令牌的redis的地方。如果連接不可用,你應該

return reply(Boom.unauthorized('Authorization failed', 'Basic'));

希望這有助於。