我正在使用HTML 5开发一些内容并在同一个内插入Facebook JavaScript SDK。
我开发了一个Facebook应用程序,我想:
1)如果用户未登录facebook,则会要求登录,但如果用户已登录并打开应用程序,则应自动请求延迟,而不是用户需要单击具有{{的链接1}}再次。
有一个Stack Overflow问题, How do I get my Facebook application to automatically ask for the required permissions post installation ,他们使用FB.LOGIN()
执行此操作,但如何在JavaScript中找到此身份验证网址?
JavaScript代码:
window.top.location = "<?php echo $loginUrl; ?>";
答案 0 :(得分:3)
使用此:
FB.getLoginStatus(function(response) {
if (response.authResponse) {
fbUserId = response.authResponse.userID;
token = response.authResponse.accessToken;
}
else {
FB.login(function(response) {
if (response.authResponse) {
fbUserId = response.authResponse.userID;
token = response.authResponse.accessToken;
}
else {
console.log('User cancelled login or did not fully authorize.');
}
}, {scope: 'user_location'});
}
},true);
答案 1 :(得分:1)
我认为最好的选择是使用authenticated referrals功能,这意味着Facebook将为您处理身份验证以及您需要的权限。
只有在用户完成身份验证过程后,才会将用户传递给您的应用程序。
如果出于任何原因不适合您,请查看authentication的文档,尤其是server-side flow的文档,因为它似乎就是您之后的内容你已经写过了。
在您的JavaScript代码中,您在启动Facebook SDK时似乎没有使用频道网址属性。正如它在JavaScript SDK documentation(频道文件部分)中所述:
频道文件解决了跨域通信的一些问题 在某些浏览器中
然后:
channelUrl参数是可选的,但建议使用。
我不能保证它会修复它,但它可能会。
应该是这样的:
// Init the SDK upon load
window.fbAsyncInit = function() {
FB.init({
appId : 'appid', // App ID
channelUrl : '//www.domain.com/channel.html', // Channel File
status : true, // Check login status
cookie : true, // Enable cookies to allow the server to access the session
xfbml : true // Parse XFBML
});
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
document.getElementById('auth-loggedout').style.display = 'none';
document.getElementById('auth-loggedinnotauthenticate').style.display = 'none';
document.getElementById('loginauthenicated').style.display = 'block';
}
else
if (response.status === 'not_authorized') {
window.top.location = "https://www.facebook.com/dialog/oauth?client_id=id&redirect_uri=http://apps.facebook.com/appp/";
}
else {
window.top.location = "https://www.facebook.com/login.php?api_key=id&skip_api_login=1&display=page&cancel_url=http://apps.facebook.com/appp/";
}
});
// Load the SDK asynchronously
(function(d){
var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
ref.parentNode.insertBefore(js, ref);
}(document));
如您所见,首先需要定义 window.fbAsyncInit 回调方法,然后才加载SDK。