Я работаю над 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 (или, может быть, мне просто нужно немного поспать).
Любые комментарии/рекомендации будут очень признательны. Спасибо.