Tôi đang sử dụng Facebook PHP SDK để đăng nhập người dùng của mình.Đăng nhập Facebook trong laravel 5.2 không thể giữ phiên sau khi chuyển hướng
Tôi tạo ra một người bảo vệ gọi là đăng nhập cho này
Đây là tập tin cấu hình của tôi 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'
]
],
để truy cập Facebook api tôi tạo ra một lớp trong App \ namespace dịch vụ gọi nó là 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');
}
}
Và đây là UserController của tôi ở đâu tôi viết logic đăng nhập của tôi
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;
}
.........
}
Mở thành công chuyển hướng Facebook login tôi đang kêu gọi UserController @ fbLogin sau khi gọi Auth::guard()->login()
i đổ phiên nó hiển thị thành công một phiên login_login_randomstring=>UserId
i. nhưng khi tôi chuyển hướng tất cả dữ liệu phiên bị mất.
Nhưng điều kỳ lạ là nó chỉ xảy ra khi nó gọi thông qua chuyển hướng facebook. Nếu tôi sử dụng chức năng này như các tuyến đường đăng nhập bình thường nó hoạt động như thế này perfactaly
trong route.php
Route::get('/login','[email protected]');
và trong UserController
function login(){
$user = User::find(12);
Auth::guard('login')->login($user);
return redirect('/');
}
Sử dụng phương pháp này tôi có thể dễ dàng truy cập Dữ liệu phiên sau khi chuyển hướng từ đây nhưng trong trường hợp facebook nó không xảy ra.
Tôi bị mắc kẹt ở đây trong hai ngày xin vui lòng bất cứ ai có thể giúp tôi
[Lưu ý: Xin đừng đề cập đến trong câu trả lời của bạn rằng tôi nên chia tuyến đường của tôi trong middleware web. ]
Tôi nghĩ rằng bạn đã không đọc câu hỏi đầy đủ tôi nói rằng tôi bị mất dữ liệu phiên của tôi sau khi xác thực thành công và sau đó chuyển hướng người dùng đến một trang khác. Việc xác thực người dùng không phải là vấn đề của tôi chút nào. –
Bạn có thể vui lòng kiểm tra cách bạn cung cấp cho 777 giấy phép để lưu trữ trong thư mục lưu trữ? http://stackoverflow.com/questions/31615462/session-not-saving-in-laravel-5-1 –