Son zamanlarda aynı sorunu genelinde geldim
, 5mins sonra veya bu nedenle hareketsizlik bir yeniden yapmanız halinde, oturum kalıcı değil gibi görünüyor. Bazen çalışır, bazen olmaz.
Geçen hafta boyunca ona bakan ettik ve düşünebildiğim tek çözüm içeren bir sayfa yeniden yapmanız JS SDK'yı kullanmaktı:
FB.Event.subscribe('auth.login', function(response) {
window.location.reload();
});
Ama ben kabul, bu kadar UX açısından çok zarif bir çözüm değil. Sen (benim için yoktu) PHP SDK'deki cookie
param, ve JS SDK'deki oauth param geçmek ve eğer inşaat görmelisiniz:
$facebook = new Facebook(array(
'appId' => $config['facebook']['id'],
'secret' => $config['facebook']['secret'],
'cookie' => true
));
VE
FB.init({
appId : appId,
channelUrl : '//domain.com/signon/channel.php',
status : true,
cookie : true,
xfbml : true,
oauth : true
});
Yine de yabancı, Github'dan latest PHP SDK'u yeniden indirdim ve bir sanal alan ortamına yükledim (Apache, PHP 5.4). Örnek (JS SDK ile) AS-IS çalıştı ve aynı sorunu var!
Şimdi yukarıdaki hardal kesmiyorsa, daha fazla öneri var.
, base_facebook.php
etrafında kazma biraz yaptıktan sonra,
$facebook->getAccessToken();
Ancak size fayda $user
eğer döner 0. yapacak geçerken, A BIT Öncelikle
SDK YUKARI DEĞİŞTİRME getCode()
yönteminin, yetkilendirme kodunu sorgu parametrelerinden almak için aslında $_REQUEST
kullandığını fark ettim.PHP Manual
, $ _REQUEST
varsayılan olarak $ _GET, $ _POST ve $ _COOKIE içeriğini içerdiğini ilişkilendirilebilir dizidir.
ANCAK
O $ _ POST veya $ _COOKIE, $ _GET için çok farklıdır.
Bu, kurulumunuza bağlı olarak biraz bugger olabilir. Bunun yerine, bu gibi göründüğünü base_facebook.php
işlevi getCode()
bulmak:
protected function getCode() {
if (isset($_REQUEST['code'])) {
if ($this->state !== null &&
isset($_REQUEST['state']) &&
$this->state === $_REQUEST['state']) {
// CSRF state has done its job, so clear it
$this->state = null;
$this->clearPersistentData('state');
return $_REQUEST['code'];
} else {
self::errorLog('CSRF state token does not match one provided.');
return false;
}
}
return false;
}
ve yeni bir dizi/değişken içine sorguyu birleştirmek şöyle array_merge()
kullanılarak $_GET
, $_POST
& $_COOKIE
diziler dahil etmek (haydi $code_array
diyebiliriz) :
$code_array = array_merge($_GET,$_POST,$_COOKIE);
Neler elde ettiğiniz, ilgili isteklerdeki tüm verileri içeren bir dizidir. Sadece bu (umarım) güzel bir iş yapmalıyım yani
\\replace $_REQUEST with $code_array;
if (isset($code_array['code'])) {
if ($this->state !== null &&
isset($code_array['state']) &&
$this->state === $code_array['state']) { //...and so on for the rest
, devam edin ve işlevi içinde $code_array
ile $_REQUEST
değiştirin.
İSTEĞE - Access Token Ömür Uzatma
Bu isteğe bağlıdır, ancak ben yine de dahil. Yeni Uygulamaların çoğu zaten uzun süreli Erişim Simgelerine sahip olacak, ancak mevcut durumda mevcut erişim belirtecinizi dönüştürmek için $facebook->setExtendedAccessToken();
yöntemini kullanabilirsiniz.
Not: kadar gerçekte getAccessToken()
yöntemle erişim jetonu almak önce $facebook->setExtendedAccessToken();
aramak zorunda.
Şimdi, kodu kullanarak size
$user = $facebook->getUser();
if($user) {
try {
// Just to be sure, add access token to each request
$facebook->setExtendedAccessToken();
$access_token = $facebook->getAccessToken();
// Fetch user details
$user = $facebook->api('/me?access_token='.$access_token);
}
//and so on..
SONUÇ $ _GET içine $ _REQUEST Breaking
, $ _ POST & $ _COOKIE (içermesine rağmen varsayılan olarak tüm üç) görünüyor olacak SDK (ler) tarafından belirlenen cookie'leri fazla sorun yaşamadan alabileceğimizden emin olun. Söylüyorum çünkü heck, kendimden% 100 emin değilim.
Durumumda çalışmasını sağlamak için yukarıdaki yöntemleri kullandım, bu nedenle, bu problem üzerinde çok fazla uyku kaybettiğim için, bazı bilgileri paylaşmayı ümit ediyorum ve geçerli bir çözüm bulamadım.
Bu yardımcı olur umarız!
DÜZENLEME: Ben
$user_profile = $facebook->api('/'.$user.'?access_token='.$access_token);
için
$user_profile = $facebook->api('/me');
dan ben de yaptım bir şey API isteği oldu değişiyor, söylemeyi unutmuşum ve bir fark yarattı. :)
Arama '$ facebook-> setExtendedAccessToken();' benim için çalıştı, teşekkürler. – Eldar
Kökte ve iframe widget'larında/widgets adresinde bir uygulama vardı. Baz facebook'taki değişikliklere ek olarak , ayrıca/widget'larda iframe widget'ları için yeni bir uygulama oluşturmanız gerekiyordu. şimdi kök etki alanındaki oturum iyi görünüyor. –
Bunu geri alıyorum, oturumlar iyi, ancak sayfa birkaç dakika boşta kaldıktan sonra kullanıcı hala 0'a geri dönüyor. –