我們使用Hapi JS爲我們的其餘服務器。我們爲Redis上的用戶存儲身份驗證令牌。現在,如果由於某種原因節點與Redis失去連接,我們需要將401 Authorization failed
錯誤返回給所有路由中的所有客戶端,以便客戶端可以自動註銷。爲hapijs返回所有路由的401錯誤
那麼,有沒有辦法在不改變路由處理函數代碼的情況下從所有路由返回401?
我們使用Hapi JS爲我們的其餘服務器。我們爲Redis上的用戶存儲身份驗證令牌。現在,如果由於某種原因節點與Redis失去連接,我們需要將401 Authorization failed
錯誤返回給所有路由中的所有客戶端,以便客戶端可以自動註銷。爲hapijs返回所有路由的401錯誤
那麼,有沒有辦法在不改變路由處理函數代碼的情況下從所有路由返回401?
您可以使用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。
是的,這正是我所做的。 – 2015-02-25 12:58:32
您應該在應用程序使用的auth插件中執行此操作。看看hapi-auth-basic的實現:https://github.com/hapijs/hapi-auth-basic/blob/master/lib/index.js
如果你看看這個方案,你必須定義一個認證方法,它接受請求和回覆。這是你應該檢查認證令牌的redis的地方。如果連接不可用,你應該
return reply(Boom.unauthorized('Authorization failed', 'Basic'));
希望這有助於。
你可以[刪除所有的路線映射](http://stackoverflow.com/questions/10378690/remove-route-mappings-in-nodejs-express/28369539#28369539)並插入一個新的? – laggingreflex 2015-02-11 21:17:39
對不起,無法準確理解刪除所有映射的好處。我想我需要一箇中間件來實現這一點。至少我需要hapijs中的中間件等價的機制。 – 2015-02-11 21:37:24
目前爲止,您如何進行身份驗證? 如果您使用hapi認證機制,則應該發生這種情況...... – 2015-02-12 10:53:51