从Facebook Best Pratices我明白我应该在初始登录页面上请求最小权限集,并延迟扩展权限请求,以确定何时需要它们。
例如。假设我对两个扩展配置文件属性的原始登录请求:
<fb:login-button show-faces="true" width="200" max-rows="1"
scope="user_photos, friends_photos">
</fb:login-button>
现在,在后一点,用户希望使用我的应用程序(需要publish_actions
)将照片上传回他们的个人资料。
据我所知,我的应用程序必须:
FB.api('/me/permissions')
)以避免无理由触发登录流程通过执行新登录来请求新的权限:
FB.login(function(response) {
// handle the response
}, {scope: 'publish_actions'});
在上面列出的第二步中,我应该只询问publish_actions
还是我还应该申请已经授予的权限?
{scope: 'user_photos, friends_photos, publish_actions'});
我正在使用Login on Client, API Calls from Server模型:
因此,在我请求新权限的那一刻,我的服务器将持有一个具有两个初始权限(user_photos, friends_photos
)的长期访问令牌。如果用户授予publish_actions
,我是否应该在上传之前再次通过整个服务器端token exchange进程(使用新的短期访问令牌)?
GET /oauth/access_token?
grant_type=fb_exchange_token&
client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={new-short-lived-token}
或者新权限是否可以立即用于长期令牌?
答案 0 :(得分:0)
向面临同样问题的任何人回答我自己的问题。
是的,授予的权限是累积的。
我应该只询问
publish_actions
还是我还应该申请已经授予的权限?
我只需要申请新的权限。以前授予的权限仍然可用。
如果用户授予
publish_actions
(使用FB.login
),我是否应该再次完成整个服务器端令牌交换过程(使用新的短期访问权限 - 令牌)上传之前?或者新的权限是否可以立即用于长期令牌?
客户端呼叫FB.login
就足够了。如果用户授予publish_actions
,我可以使用先前存储的服务器端令牌发布内容。
一个小问题:当您致电FB.login
时,用户可能会再次跳过该权限(它将返回response.status === "connected"
)。所以我必须仔细检查权限:
使用回调检查权限的功能:
function checkPermissions(perms, callback, failCallback) {
FB.api('/me/permissions', function (response) {
var fbPerms = response.data[0];
var haveAllPermissions = true;
if (typeof perms === 'string') {
perms = [ perms ];
}
for (var i in perms) {
if (fbPerms[perms[i]] == null) {
haveAllPermissions = false;
break;
}
}
if (haveAllPermissions) {
callback();
} else {
failCallback();
}
});
}
假设photoUpload
是一个需要publish_actions
权限的函数,以下是适用于我的使用模式:
// First check
checkPermissions("publish_actions",
// If the required permissions have already been granted
// call the desired method
photoUpload,
// else
function () {
// Asks for permission
FB.login(function () {
// double check - the usar may have skiped the permission again
checkPermissions("publish_actions",
// if the user granted the permission, call the desired method
photoUpload,
// else cancel everything and warn the user
function () {
alert("Can't post without permissions");
});
}, {scope: "publish_actions"});
});