Вход в Facebook в laravel 5.2 не может провести сеанс после перенаправления
Я использую PHP PHP SDK для регистрации моего пользователя.
Я создал охранник под названием login для этого
Вот мой конфигурационный файл auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
'admin'=>[
'driver'=>'session',
'provider'=>'adminusers',
],
'verify'=>[
'driver'=>'session',
'provider'=>'verify',
],
'login'=>[
'driver'=>'session',
'provider'=>'users'
]
],
для доступа к Facebook api я создал класс в пространстве имен приложений \services, назвав его Facebook
App\Services\Facbook.php
<?php
namespace App\Services;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;
use App\Extensions\Facebook\FacebookLaravelPersistentDataHandler;
use Facebook\Facebook as FB;
use App;
class Facebook{
protected $fb;
protected $helper;
protected $permission;
protected $log;
protected $canvashelper;
protected $persistentDataHandler;
function __construct()
{
$this->fb = new FB([
'app_id'=>Config::get('facebook.app_id'),
'app_secret'=>Config::get('facebook.app_secret'),
'default_graph_version' => Config::get('facebook.default_graph_version'),
'persistent_data_handler' => new FacebookLaravelPersistentDataHandler(),
]);
$this->helper = $this->fb->getRedirectLoginHelper();
$this->permission = Config::get('facebook.permission');
$this->log = new Logging(Config::get('facebook.logfile'),'Facebook Log');
$this->canvashelper = $this->fb->getCanvasHelper();
$this->persistentDataHandler = new FacebookLaravelPersistentDataHandler();
}
public function FBAuthUrl()
{
if($this->isFBAuth())
{
return $this->helper->getLogoutUrl($this->persistentDataHandler->get('facebook_access_token'),route('facebook.logout'));
}
else
{
return $this->helper->getLoginUrl(route('facebook.callback'),$this->permission);
}
}
public function LoginCallback()
{
$accessToken = $this->helper->getAccessToken();
if(isset($accessToken))
{
$this->persistentDataHandler->set('facebook_access_token',(string) $accessToken);
}
}
public function isFBAuth()
{
return $this->persistentDataHandler->has('facebook_access_token');
}
public function getFBUser()
{
if($this->isFBAuth())
{
$this->fb->setDefaultAccessToken($this->persistentDataHandler->get('facebook_access_token'));
/*,user_birthday,user_tagged_places*/
$response = $this->fb->get("/me?fields=id,name,first_name,last_name,age_range,link,gender,locale,picture,timezone,updated_time,verified,email");
return $response->getGraphUser();
}
else
{
return false;
}
}
public function logout()
{
$this->persistentDataHandler->delete('facebook_access_token');
$this->persistentDataHandler->delete('state');
}
}
И вот мой UserController Где я пишу логин логина
class UserController extends Controller
{
.....
/*
* Facebook login callback function
* @param Object App\services\Facebook
* return redirect
*/
public function fbLogin(Facebook $facebook)
{
$facebook->LoginCallback();
/*
* get the usergraphnode from facebook
*/
$fbUser = $facebook->getFBUser();
/*
* Convert UserGraphNode User To Eloquent User
*/
$user = $this->getFBLoggedUser($fbUser);
/*
* Here Log the user in laravel System
*/
Auth::guard('login')->login($user);
//dump(Auth::guard($this->guard)->user());
dump(session()->all());
return reidrect('/');
}
public function getFBLoggedUser($fbUser)
{
if(User::where('email','=',$fbUser->getField('email'))->count())
{
$user = User::where('email','=',$fbUser->getField('email'))->first();
if($user->fb_app_id){
$user->fb_app_id = $fbUser->getField('id');
$user->save();
}
}
else
{
$user = $this->FBregister($fbUser);
}
return $user;
}
/**
* Register The user logged in from Facebook
*
* @param \Facebook\GraphNodes\GraphUser;
*
* return \App\Models\User
*/
public function FBregister($fbUser)
{
$user = new User();
$user->fname = $fbUser->getField('first_name');
$user->lname = $fbUser->getField('last_name');
$user->gender = $fbUser->getField('gender');
$user->email = $fbUser->getField('email');
$user->fb_app_id = $fbUser->getField('id');
$picture = $fbUser->getField('picture');
if($picture->isSilhouette()){
$user->profile_image = $picture->getUrl();
}
$user->save();
return $user;
}
.........
}
При успешном переадресации имени пользователя Facebook я вызываю UserController @fbLogin
после вызова Auth::guard()->login()
я dump session успешно показывает сеанс login_login_randomstring=>UserId
i. но когда я перенаправляю все потерянные данные сеанса.
Но странно то, что это происходит только тогда, когда он вызывает перенаправление через facebook. Если я использую эту функцию, как обычные логин-логин, она работает с перфорацией, как это
в route.php
Route::get('/login','[email protected]');
и в UserController
function login(){
$user = User::find(12);
Auth::guard('login')->login($user);
return redirect('/');
}
Используя этот метод, я могу легко получить доступ к данным сеанса после перенаправления отсюда, но в случае с facebook этого не происходит.
Я застрял здесь в течение двух дней, пожалуйста, кто-нибудь может мне помочь.
[Примечание. Пожалуйста, не упоминайте в своем ответе, что я должен сгруппировать свои маршруты в веб-промежуточном программном обеспечении. ]
Ответы
Ответ 1
После глубокого рытья в laravel я наконец нашел то, что я делал неправильно. И я публикую, может быть, это поможет некоторым в будущем.
Важная вещь: - Laravel сохраняет сеанс очень долго в своем жизненном цикле запроса. Он сохраняет сеанс, отправляет ответ заголовка. Поэтому, если мы повторим что-то в классе контроллера, тогда он отправит ответ заголовка, не делая сохранение сеанса, и наш сеанс не будет сохранен. В моем случае я использую функцию dump
в моем контроллере, которая завершает жизненный цикл по умолчанию laravel и принудительно передает ответ заголовка в браузер. что все данные сеанса теряются. я удаляю dump()
форму моего кода, и все начинает работать правильно
Ответ 2
В соответствии с документацией API https://laravel.com/api/5.2/Illuminate/Auth/Guard.html
вы должны вызвать метод user()
для получения текущего пользователя, прошедшего проверку подлинности. Поэтому я бы предположил, что вместо Auth::guard()
используйте Auth::user($user)
.
Ответ 3
попробуйте использовать плагин-socialite для входа в facebook socialite
Facebook php sdk use $_SESSION.In laravel, вы не можете получить доступ к этой переменной, laravel использует личный класс для сеанса.
Ответ 4
В соответствии с кодом api и вашей документации в facebook. Простой сеанс работы с запросом. Вы можете сохранить свои данные с помощью
Для ввода сеанса в значение
Session::put('userid','1');
Получить значение
$request->session()->get('userid') //or
{!! Session::get('userid') !!}
Очень полезная вещь в вашем случае.