Использование Hapijs и Bell с провайдером Twitter. Как обработать отказ в авторизации из Twitter с помощью модуля Bell?

Я использую фреймворк Hapi (nodejs) с модулем Bell, работая с провайдером Twitter.

Было довольно просто получить рабочий код с примером, приведенным на странице github. Я получаю доступ к маршруту /login, и меня перенаправляют в Twitter, где я авторизую приложение, а затем меня перенаправляют обратно на /login?oauth_token=xxxxxxx&oauth_verifier=xxxxxxx, где я может иметь доступ к профилю пользователя в request.auth.credentials.

Проблема возникла, когда я попытался отклонить приложение. Вместо нажатия кнопки «Войти» в Твиттере я нажал кнопку «Отмена», а затем кнопку «Вернуться на название сайта». Эта последняя кнопка перенаправляет меня на /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 ожидает oauth_token и oauth_verifier в request.params, но disabled param не интерпретируется стратегией, поэтому происходит перенаправление.

Кому-то удалось справиться с этим сценарием?


person Tony    schedule 22.09.2014    source источник


Ответы (1)


Я нашел обходной путь. Это не оптимальное решение, но, по крайней мере, позволяет мне справиться с отказом от 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, которую я создал в репозитории Bell относительно этой ошибки.

person Tony    schedule 30.09.2014