Javascript 使用Facebook Graph API进行弹出式身份验证的简单示例
试图让Facebook通过javascript弹出窗口验证我的用户。现在,我有:Javascript 使用Facebook Graph API进行弹出式身份验证的简单示例,javascript,html,facebook,Javascript,Html,Facebook,试图让Facebook通过javascript弹出窗口验证我的用户。现在,我有: <input type="button" value="Connect with Facebook" onclick="window.open('https://graph.facebook.com/oauth/authorize?client_id=XXXXXXXXXXX&redirect_uri=http://example.com/step2&display=popup')" />
<input type="button" value="Connect with Facebook" onclick="window.open('https://graph.facebook.com/oauth/authorize?client_id=XXXXXXXXXXX&redirect_uri=http://example.com/step2&display=popup')" />
但当用户通过Facebook登录时,弹出窗口仅显示Facebook.com主页。我希望弹出窗口能够验证用户身份并离开,这样我就可以开始从graph api检索用户数据
有没有更好/更简单的方法?简单的例子不胜感激
谢谢。facebook中的oauth2包括两个步骤,调用authorize获取代码,然后调用access\u token获取token。 处理pop登录的一种方法: 在新窗口中打开登录url,就像您所做的一样,当facebook在弹出窗口中重定向回您的url时,您可以通过服务器端代码或使用javascript捕获url查询参数来设置cookie,当页面加载到弹出窗口中时,立即关闭窗口。关闭 在主页面上,在window.open代码之后,添加JavaScript代码以检测弹出窗口是否关闭并捕获cookie:
var signinWin;
$('#FacebookBtn').click(function () {
var pos = screenCenterPos(800, 500);
signinWin = window.open("[URL]", "SignIn", "width=780,height=410,toolbar=0,scrollbars=0,status=0,resizable=0,location=0,menuBar=0,left=" + pos.x + ",top=" + pos.y);
setTimeout(CheckLoginStatus, 2000);
signinWin.focus();
return false;
});
function CheckLoginStatus() {
if (signinWin.closed) {
$('#UserInfo').text($.cookie("some_cookie"));
}
else setTimeout(CheckLoginStatus, 1000);
}
签出本文:自定义弹出式身份验证。最好像Avner所说的那样,从子窗口执行回调函数,并使用计时器监视窗口是否关闭。这样,如果关闭子窗口时未执行特定操作,则可以对父窗口执行相应操作
**On Child**
// Set oAuthToken from server side when it comes back from authenticating
// and you have the token on the server side.
var oAuthToken = "";
oAuthToken = "--STRING INSERTED BY SERVER SIDE CODE--";
window.opener.pbFromPopup(oAuthToken);
**On Parent :**
function CheckLoginStatus() {
if (authWindow.closed) {
// Handle error if authentication window is closed
// without any action on Allow or Deny
alert("window closed");
//location.href = "errorPage.aspx?error=authwinclosed;
}
else setTimeout(CheckLoginStatus, 1000);
}
function pbFromPopup(token) {
// Function called from child window,
// token is passed back from child
authWindow.close();
// Put token in a hidden form field and submit the form to pass
// it back to the server
$("#authToken").val(token);
$("#form1").submit();
}
为什么不干脆
function authorizeAppInPopup() {
FB.login(function(response) {
if (response.authResponse) {
// User authorized app
} else {
// User cancelled login or did not fully authorize
}
}, {scope: 'publish_stream'});
}
?:]
您可以在重定向url中使用脚本,而不是在原始窗口中使用计时器(可能会比您预期的延迟更多),该脚本将在弹出窗口中运行:if(opener&&“!=opener.location){opener.handler();}window.close();这将在打开的窗口上调用handler()并关闭弹出窗口。仅当父窗口仍然打开且未导航到其他域时,才会调用处理程序。我认为screenCenterPos函数丢失了。
$(“#UserInfo”)。text($.cookie(“some#cookie”);
应该是$(“#UserInfo”)。text($.cookie(“some#cookie”);
。您缺少结束语)
.wooow,由于某些原因,我从未想过我可以在模态窗口关闭时进行某种回调,这太棒了!!我曾想过通过套接字向自己发送消息,但现在这显然是过火了。您的代码很好,但用户令牌将在2小时后过期