gpt4 book ai didi

javascript - Facebook 登录 JS - FB.Event.subscribe ('auth.login' ) 在没有登录按钮点击的情况下触发

转载 作者:可可西里 更新时间:2023-11-01 02:40:34 26 4
gpt4 key购买 nike

我正尝试在我的网站上实现 log-in-with-facebook 功能,真的需要你的帮助。

基本上,我正在努力实现以下目标:

  • 如果用户之前已经确认该应用程序并单击 FB 登录按钮在我的网站上,他们登录到该网站(与网站的用户与 Facebook 用户 ID 关联的帐户)

  • 如果用户之前未确认应用程序,则在 FB 登录(并订阅应用程序)时,他们将被重定向到网站的注册页面。这里的表单预先填写了用户数据通过 Facebook 访问,注册过程变得更加简单快捷。

我正在使用下面的代码。

<body>

<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId: 'xxxxxxxx',
status: true,
cookie: true,
xfbml: true,
oauth: true
});

FB.Event.subscribe('auth.login', function(response) {
if (response.status === 'connected') {
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;

if ((parseFloat(uid) == parseInt(uid)) && !isNaN(uid)) {
$.ajax({
url: '/user_actions/prep_facebook_registration',
cache: false,
type: 'POST',
data: { 'uid': uid, 'token': accessToken },
dataType: 'json',
success: function(data) {
if (data.success=='true') {
if ((typeof(data.redirect) != 'undefined')) {
window.location=data.redirect;
}
}
}
});
}
}
});

FB.Event.subscribe('auth.logout', function(response) {
FB.getLoginStatus(function(res) {
if (!res.authResponse) {
window.location='/access/logout';
}
});
});

FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
//not doing anything so far
}
});
};
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>

登录按钮位于网站的更下方:

<div class="fb-login-button" autologoutlink="true" data-show-faces="false" data-width="166" data-max-rows="1" style="position: absolute; top: 5px; right: 0;" scope="email"></div>

这里的问题是 FB.Event.subscribe('auth.login') 不仅在点击 FB 登录按钮时触发,而且在用户登录 Facebook 并且仅在访问我的网站后触发。这会导致重定向到注册页面或重新加载当前页面,即使用户没有单击登录按钮也是如此!

'/user_actions/prep_facebook_registration' 包含一个脚本,它正在检查成员(member)是否必须被重定向到注册页面或是否应该使用本地帐户登录。它返回要重定向的 URL。

我做错了什么?如何避免 FB.Event.subscribe('auth.login') 在登录按钮点击之外被触发?

最佳答案

其实,还有更好的解决办法。

有两件事你可以做得更好:

  1. 在您的 FB.init 方法中,您正在设置 status: true。这告诉页面它应该在页面加载后立即检查用户是否登录了 facebook。在您的情况下,不仅您不需要它 - 它会占用访问者的一些带宽来往返 Facebook,而您实际上并不需要。
  2. 您无需记住 uid 和 accessToken 变量,因为您可以使用 FB.getLoginStatus 方法按需获取它们。

基于您的示例代码的完整解决方案是:

<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : 'YOUR APP ID',
status : false,
cookie : true,
xfbml : true
});
};

(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));

function Facebook_login () {
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
if ((parseFloat(uid) == parseInt(uid)) && !isNaN(uid)) {
$.ajax({
url: '/user_actions/prep_facebook_registration',
cache: false,
type: 'POST',
data: { 'uid': uid, 'token': accessToken },
dataType: 'json',
success: function(data) {
if (data.success=='true') {
if ((typeof(data.redirect) != 'undefined')) {
if (data.redirect=='current') {
location.reload();
} else {
window.location=data.redirect;
}
}
}
}
});
}
}
}
}
</script>

<div class="fb-login-button" onlogin="Facebook_login()" autologoutlink="true" [parameters]></div>

关于javascript - Facebook 登录 JS - FB.Event.subscribe ('auth.login' ) 在没有登录按钮点击的情况下触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9110519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com