2016-09-12 38 views
14

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. ]

Trả lời

7

Sau khi đào rất sâu trong laravel cuối cùng tôi đã tìm thấy những gì tôi đã làm sai. Và tôi đang đăng bài có thể giúp nó trong tương lai.

Điều quan trọng: - Laravel lưu phiên cuối cùng trong vòng đời yêu cầu của nó. Nó lưu phiên nó gửi phản hồi tiêu đề. Vì vậy, nếu chúng ta echo một cái gì đó trong lớp điều khiển sau đó nó sẽ gửi phản hồi tiêu đề mà không làm tiết kiệm phiên và phiên của chúng tôi sẽ không lưu.Trong trường hợp của tôi, tôi sử dụng chức năng dump trong bộ điều khiển kết thúc vòng đời mặc định của Laravel và gửi phản hồi tiêu đề mạnh mẽ tới trình duyệt. đó là lý do tại sao tất cả dữ liệu phiên bị mất. tôi xóa dump() tạo mã của tôi và mọi thứ bắt đầu hoạt động chính xác

4

Theo tài liệu API https://laravel.com/api/5.2/Illuminate/Auth/Guard.html bạn nên gọi user() để nhận người dùng hiện đã được xác thực. Vì vậy, tôi sẽ đề nghị thay vì Auth::guard() sử dụng Auth::user($user).

+0

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. –

+0

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 –

4

cố gắng sử dụng trong xã hội plugin cho đăng nhập với facebook socialite

Facebook php sdk sử dụng $ _SESSION.In laravel bạn không thể truy cập vào biến này, laravel sử dụng lớp cá nhân đối với phiên làm việc.

+0

Tôi biết rằng đó là lý do tại sao tôi đã thêm một lớp xử lý dữ liệu tùy chỉnh nhất định 'App \ Extensions \ Facebook \ FacebookLaravelPersistentDataHandler 'chịu trách nhiệm ghi dữ liệu vào phiên. Về việc sử dụng Socialite, nó là một plugin tốt nhưng chúng tôi chỉ có thể nhận được các dịch vụ rất cơ bản từ facebook với điều đó. –

+0

và tôi thấy lý do phiên mất dữ liệu của nó, hãy kiểm tra câu trả lời của tôi –

2

Theo mã api và tài liệu facebook của bạn. Phiên làm việc đơn giản với yêu cầu. Bạn có thể lưu dữ liệu của bạn với

Đối với phiên đưa về giá trị

Session::put('userid','1'); 

Lấy giá trị

$request->session()->get('userid') //or 
    {!! Session::get('userid') !!} 

điều rất hữu ích trong trường hợp của bạn.

+0

cảm ơn câu trả lời của bạn nhưng đây không phải là vấn đề của tôi. Tôi giải thích câu trả lời của vấn đề với chi tiết trong câu trả lời của tôi. Xem câu trả lời của tôi –

Các vấn đề liên quan