Оказывается, что FB.login (обратный вызов) прекрасно работает на странице холста, а также избегает перенаправления.
Так что ответом для меня было просто изменить FB.ui вместо того, чтобы делать FB.login. Ответ, отправленный на обратный вызов, немного отличается от FB.ui, но очень близок.
FB.login(function(response) {
if(response && response.session) {
//do stuff with session
}
});