Требование расширенных разрешений с помощью JS SDK без необходимости использования FB.login()

Я работаю над canvas-приложением, и я хочу сделать следующее с JS SDK:

  • Проверьте, предоставил ли пользователь определенные расширенные разрешения

    • Если это так, вызовите некоторую функцию startServerProcess()

    • Если нет, отобразите диалоговое окно auth, чтобы получить разрешения и предупредить пользователя, если они не обеспечивают достаточный доступ.

Я хочу полностью обработать это на стороне клиента, так что startServerProcess() никогда не вызывается, если пользователь не предоставляет права доступа, учитывая, что сервер script, который он выполняет, полагается на эти разрешения.

После поиска я нашел это решение, но он использует только FB.login(), который я не хочу вызывать каждый раз, потому что если пользователь уже аутентифицируется, открывается раздражающее диалоговое окно auth, а затем автоматически закрывается сразу же после.

Мое первоначальное решение - вызвать FB.getLoginStatus(), а затем сделать api-вызов графика /me/permissions, если это возможно, и вызвать только FB.login(), если мне действительно нужно отобразить диалог auth.

Вот код, который у меня есть на данный момент:

$('#my_ui_button').click(function() {
    require_perms(function(is_authenticated) {
        if(!is_authenticated) {
            startServerProcess();
        } else {
            alert('Sorry, we cannot start the server process until you grant permission');
        }
    });
});


function require_perms(callback) {
    // check if the user is logged in + connected to the app
    FB.getLoginStatus(function(response) {

        // if the user is logged in, continue to check permissions
        if(response.authResponse) {
            FB.api('/me/permissions', function(perms_response) {

                // if photo access already exists, we're good to go
                if(perms_response['data'][0]['user_photos'] && perms_response['data'][0]['friends_photos']) {
                    console.log('permissions are already granted.');
                    callback(true);

                    // photo access does not exist, so show an auth dialog
                } else {

                    // get photo permissions
                    console.log('requesting permission...');
                    FB.login(function(response) {
                        if(response.authResponse) {
                            console.log('permission granted');
                            callback(true);
                        } else {
                            console.log('permission request failed');
                            callback(false);
                        }
                    }, {
                        scope : 'user_photos,friends_photos'
                    });
                }
            });
            // user is not connected to the app, so show an auth dialog
        } else {

            // get photo permissions
            console.log('requesting permission...');
            FB.login(function(response) {
                if(response.authResponse) {
                    console.log('permission granted');
                    callback(true);
                } else {
                    console.log('permission request failed');
                    callback(false);
                }
            }, {
                scope : 'user_photos,friends_photos'
            });
        }
    });
}

Это похоже на грязный способ решения проблемы? Мне особенно не нравится тот факт, что я повторяю этот код FB.login(), но я столкнулся с некоторыми проблемами, устраняя это, учитывая асинхронный характер вызова графика api (или, может быть, мне просто нужно немного поспать).

Любые комментарии/рекомендации будут очень признательны. Спасибо.

Ответ 1

Я думаю, что это значительно усложняет то, что может быть достигнуто с помощью FB.login(). FB.login() приведет к появлению всплывающих окон, если пользователь не войдет в систему (так что они понадобятся в любом случае) или если cookie сеанса недоступен. Вы можете просто вызвать FB.getLoginStatus() после инициализации страницы, чтобы убедиться, что cookie добавляется немедленно, если доступно.

Всплывающее окно практически неизбежно и стандартное поведение большинства приложений. Я не думаю, что ваше решение получило бы намного больше:

FB.init({...});
FB.getLoginStatus();

затем

FB.login({},{scope:...});

Ответ 2

Используйте диалог oAuth. В соответствии с документацией. Позволяет пользователю предоставлять разрешения вашему приложению. Направьте браузер пользователя на http://www.facebook.com/dialog/oauth/? Объем = электронная почта, user_birthday & client_id = 123050457758183 & redirect_uri = HTTP://www.example.com/response& response_type = маркер

проверить эту ссылку для полной documntation: https://developers.facebook.com/docs/reference/dialogs/oauth/

Ответ 3

Я не вижу проблемы в вашем подходе. Одной из причин, которые следует также учитывать, является проблема с выпуском броузера браузера или сервером. Убедитесь, что вы тестируете последнюю версию своего кода. Тестирование приложения в новом браузере часто является хорошей идеей.

Ответ 4

Последние два дня у меня точно такая же проблема, но, наконец, я ее решил. На этапе разработки я только протестировал приложение с моей собственной учетной записью facebook, и я не видел никаких ошибок с помощью экрана входа в Facebook, но когда я начал тестировать приложение с другими учетными записями facebook (у которого нет тестера или пользователя-разработчика для мое приложение), я столкнулся с этой проблемой. Он фиксируется после добавления этих пользователей в качестве тестера (из приложения- > Настройки- > роли Develeoper) в мое приложение. Надеюсь, это сработает.