node.js - 将 Hapijs 和 Bell 与 Twitter 提供商一起使用。如何使用 Bell 模块处理 Twitter 的授权拒绝?

标签 node.js twitter hapi.js

我正在使用 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_tokenoauth_verifier,但是 策略不会解释拒绝的参数,这就是发生重定向的原因。

有人设法处理这种情况吗?

最佳答案

我找到了解决方法。这不是最佳解决方案,但至少可以让我处理 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);

通过这一更改,我可以在处理程序中捕获并显示身份验证错误,而无需自动重定向。

至少这是我设法让它发挥作用的方式。此修改的缺点是,如果更新了响铃模块,则修改会丢失并且错误会再次出现,除非更新的模块已经对此进行了修复。所以,你必须留意这一点。

这是 Github issue 的链接我在贝尔存储库上创建了有关此错误的信息。

关于node.js - 将 Hapijs 和 Bell 与 Twitter 提供商一起使用。如何使用 Bell 模块处理 Twitter 的授权拒绝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966130/

相关文章:

mysql - Node.js脚本过早退出

facebook - 如何在我网站的评论中显示 facebook 和 twitter 用户个人资料图片

twitter - 获取视频推文的视频观看次数

javascript - Hapi.js、Bookshelf.js 和一个真实世界的例子

javascript - 使用 Heroku 以编程方式更改全局变量?

node.js - 未设置安全 cookie

node.js - 如何添加外键来 Sequelize 模型

Twitter O-Auth 回调网址

javascript - NodeWebkit - 部署应用程序

javascript - 我应该如何管理 Hapijs 中的 session ?