使用Hapijs和贝尔与叽叽喳喳提供商。 如何使用Bell模块处理来自Twitter的授权拒绝?

我使用Hapi框架(nodejs)与Bell模块一起使用Twitter提供程序。

用github页面给出的例子来获得一个工作代码非常简单。 我访问/login路线,我被redirect到Twitter,在那里我授权的应用程序,然后我被redirect回/login?oauth_token = xxxxxxx&oauth_verifier = xxxxxxx在那里我可以访问的用户configuration文件在request.auth.credentials 。

当我试图拒绝应用程序时,问题出现了。 我不是点击Twitter上的“login”button,而是点击“取消”button,然后点击“返回到网站名称 ”button。 最后一个button将我redirect到/ login?denied = xxxxxx ,然后我被redirect到Twitter以批准该应用程序。

我尝试使用另一个例子在同一页面https://github.com/hapijs/bell#handling-errors中处理这种情况,但不能得到它的工作。

server.route({ method: ['GET', 'POST'], path: '/login', config: { auth: { strategy: 'twitter', mode: 'try' }, handler: function (request, reply) { if (!request.auth.isAuthenticated) { return reply('Authentication failed due to: ' + request.auth.error.message); } return reply.redirect('/home'); } } }); 

看来在检查request.auth之前,它会解释/ loginpath并redirect到Twitter。 我仍然不太了解Bell模块,但是可能是Twitter策略期望request.params中的oauth_tokenoauth_verifier ,但是被拒绝的参数不是由策略解释的,这就是redirect发生的原因。

有人设法处理这种情况?

我find了一个解决方法。 这不是一个最佳的解决scheme,但至less让我来处理来自Twitter的拒绝。

我不得不修改铃模块内的文件。 在bell/lib/oauth.js ,在oauth_token的validation之前

 exports.v1 = function (settings) { var client = new internals.Client(settings); return function (request, reply) { var cookie = settings.cookie; var name = settings.name; // Sign-in Initialization // Verify if app (Twitter) was rejected if (name=='twitter' && request.query.denied) { return reply(Boom.internal('App was rejected')); } if (!request.query.oauth_token) { // Obtain temporary OAuth credentials var oauth_callback = request.server.location(request.path, request); 

有了这个变化,我可以捕获并显示处理程序中的身份validation错误,而无需自动redirect。

至less这是我设法使它工作的方式。 这种修改的缺点是,如果更新了铃模块,那么修改将会丢失,并再次出现错误,除非已更新的模块已经为此进行了修复。 所以,你必须留意这一点。

这里是关于我在Bell存储库上创build的关于这个bug的Github问题的链接。