我正在与Twitter一起使用钟模块的Hapi框架(nodejs)。
使用github页面中给出的示例获得一个工作代码非常简单。我访问/login路由,然后被重定向到Twitter,在那里我授权应用程序,然后我被重定向回/login,在那里我可以访问request.auth.credentials中的用户配置文件。
当我试图拒绝这个应用程序时,问题就来了。我没有点击Twitter上的“登录”按钮,而是单击“取消”按钮,然后单击“返回站点名称”按钮。最后一个按钮将我重定向到/login?denied=xxxxxx,然后重定向(再次)到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之前,它会解释/login路由并重定向到Twitter。我仍然不太理解贝尔模块,但可能是推特策略期望oauth_token和oauth_verifier在request.params中,但是被拒绝的param不会被该策略解释,这就是重定向发生的原因。
有人能处理好这种情况吗?
发布于 2014-09-30 00:32:32
我找到了解决办法。这不是一个最佳的解决方案,但至少允许我处理来自Twitter的拒绝。
我不得不修改贝尔模块中的一个文件。在bell/lib/oauth.js中,在oauth_token验证之前
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);使用该更改,我可以捕获并显示处理程序中的auth错误,而不需要自动重定向。
至少这是我设法让它运转的方式。这种修改的缺点是,如果贝尔模块被更新,那么修改就会丢失,错误再次出现,除非更新的模块已经有了相应的修复。所以,你得盯着它。
下面是我在贝尔存储库上创建的关于这个bug的Github问题链接。
https://stackoverflow.com/questions/25966130
复制相似问题