1

Я хочу перенаправить пользователей на страницу oauth, если они удалили какие-либо разрешения, требуемые моим приложением.Facebook oauth javascript redirect, приводящий к бесконечному циклу

По какой-то причине приведенный ниже код приводит к бесконечному циклу при попытке перенаправления из функции обратного вызова FB.api. Любые идеи, как я могу это исправить?

var perms   = ['publish_actions', 'email', 'user_birthday', 'user_location'], 
    permsString  = perms.join(','), 
    permissionsUrl = 'https://www.facebook.com/dialog/oauth'; 
    permissionsUrl += '?client_id=' + config.facebook.appId; 
    permissionsUrl += '&redirect_uri=' + encodeURI(canvasUrl); 
    permissionsUrl += '&scope=' + permsString; 

    FB.getLoginStatus(function (response) { 

     if (response.status === 'connected') { 

      FB.api('/me/permissions', function(response) { 

       // using underscore here... 
       var keys = _.keys(response.data[0]), 
        diff = _.difference(perms, keys); 

       // send the user through the auth again if they've removed any of the perms we need 
       if (diff.length) { 

        window.location.href = permissionsUrl; // results in an endless redirect loop 
        // window.location.href = 'http://randomwebsite.com'; // does redirect successfully!!!! 
       } 
      }); 
     } 

    }, true); 
+0

методом проб и ошибок я обнаружил, что упаковка перенаправлять в именованной функции вне обратного вызова а затем ссылаться на это в обратном вызове, казалось, сделал трюк – techjacker

+0

@techijacker У меня похожие проблемы .. можете ли вы привести несколько примеров того, как вы преодолеваете эту ситуацию? –

ответ

0

Это было некоторое время, так как я это сделал, но из памяти я решил его с чем-то вроде этого:

var redirectMe = function (link) { 
    window.location.href = link; 
}; 

FB.getLoginStatus(function (response) { 
    if (response.status === 'connected') { 
     FB.api('/me/permissions', function(response) { 
      if (true) { 
       redirectMe('http://www.browsehappy.com'); 
      } 
     }); 
    } 
}, true);