我正在将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的链接。

10-02 13:47