Facebook API login

Beavis

Banned
Ставлю на сайт кнопку логина через facebook
Не догоняю что делать в ситуации если пользователь авторизовался через ФБ, потом делает logout на сайте, а в фейсбуке остается залогиненным.
В этом случае при нажатии на кнопку Login выскакивает окно, проверяет что пользователь авторизован, и закрывается. Я не знаю как это событие правильно отловить чтобы авторизовать пользователя и на сайте.
 

Beavis

Banned
PHP:
<div id="fb-root"></div>
<div class="fb-login-button" scope="email">Login with Facebook</div>

...

<script type="text/javascript">
window.fbAsyncInit = function() {
	FB.init({
		appId      : fbAppId,
		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;
			window.location.href = 'login_fb.php?uid='+uid+'&token='+accessToken+'&nc='+Math.random();
		} else if (response.status === 'not_authorized') {
			// the user is logged in to Facebook, 
			// but has not authenticated your app
		} else {
			// the user isn't logged in to Facebook.
		}
	});
};

(function(d){
var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName('head')[0].appendChild(js);
}(document));
{/literal}
</script>
 

Absinthe

жожо
Beavis я в свое время 2 дня сидел над проблемой, высосанной из "Oauth слишком сложный, вот наша простая реализация авторизации".
Как результат 2 дня против 2 часов у оригинального "сложного" протокола.

Поэтому мой совет: мужайся.
 

Raziel[SD]

untitled00
Все проще - ты не должен заставлять юзера разлогиниваться на ФБ, ты должен просто брать от ФБ данные о пользователе, т.е. юзер нажал "логин" - ты попросил информацию о юзере и залогинил, юзер нажал "выход" - ты юзера у себя разлогинил.
 

Beavis

Banned
Все проще - ты не должен заставлять юзера разлогиниваться на ФБ, ты должен просто брать от ФБ данные о пользователе, т.е. юзер нажал "логин" - ты попросил информацию о юзере и залогинил, юзер нажал "выход" - ты юзера у себя разлогинил.
я и не собираюсь его разлогинивать из фейсбука
вот юзер нажал "выход", он разлогинился с моего сайта, но остался залогиненным на фейсбуке
и когда он в следующий раз нажимает на кнопку "войти через фейсбук" на моем сайте, окошко авторизации открывается, проверяет что он уже залогинен на ФБ, и просто закрывается, не вызывая никаких событий. Т.е. я не могу отловить этот момент чтобы авторизовать пользователя на своём сайте.

Beavis я в свое время 2 дня сидел над проблемой, высосанной из "Oauth слишком сложный, вот наша простая реализация авторизации".
Как результат 2 дня против 2 часов у оригинального "сложного" протокола.

Поэтому мой совет: мужайся.
Я тебя не понял :) Мне нужно установить авторизацию через фейсбук, я делаю это по официальной документации и средствами SDK от FB
Что я делаю не так?)
 

Beavis

Banned
На всякий случай перечитал пример ещё раз, но он никак не относится к моей проблеме. Ты наверное не понял её суть.
Объясню как можно проще:

После того как пользователь успешно осуществляет авторизацию через ФБ, срабатывает следующее событие:
PHP:
FB.Event.subscribe('auth.login', function(response) {
   window.location.reload();
});
Если же пользователь УЖЕ залогинен через ФБ, но не залогинен на сайте (например если он вышел с сайта), то это событие не срабатывает, и не понятно как эту ситуацию обработать.
 

Beavis

Banned
Решил проблему, переопределив обработчик нажатия на кнопку Login, добавив к вызову функции логина опцию auth_type: 'reauthenticate', которой почему-то нет в документации к JS SDK

PHP:
<div class="fb-login-button" scope="email" onclick="fbLogin();">Login with Facebook</div>

...

function fbLogin()
{
	FB.login(function(response) {
		if (response.authResponse) {
			console.log('Welcome!  Fetching your information.... ');
			FB.api('/me', function(response) {
				console.log('Good to see you, ' + response.name + '.');
			});
		} else {
			console.log('User cancelled login or did not fully authorize.');
		}
	}, { 
		auth_type: 'reauthenticate',
		scope: 'email'
	});
}
 
Сверху