Javascript 使用Facebook Graph API进行弹出式身份验证的简单示例

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')" />

试图让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')"  />

但当用户通过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小时后过期