我正在将Hapi框架(nodejs)与Bell模块一起使用,并与Twitter提供程序一起工作。
使用github页面中给出的示例来获取工作代码非常简单。我访问/ login路由,然后重定向到Twitter,在此我授权了该应用程序,然后重定向回/ login?oauth_token = xxxxxxx&oauth_verifier = xxxxxxx,可以在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。我仍然不太了解Bell模块,但是可能是Twitter策略期望request.params中的oauth_token和oauth_verifier,但是策略未解释拒绝的参数,这就是重定向发生的原因。
有人设法处理了这种情况吗?
最佳答案
我找到了解决方法。这不是最佳解决方案,但至少可以让我处理来自Twitter的拒绝。
我必须在bell模块中修改一个文件。在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错误,而无需自动重定向。
至少这是我设法使其起作用的方式。这种修改的缺点是,如果更新了bell模块,则修改将丢失,并且错误会再次出现,除非已更新的模块已经对此进行了修复。因此,您必须注意这一点。
这是我在Bell存储库中创建的关于此bug的Github issue的链接。