2016-03-14 125 views
3

簡短版本:如何在不使用會話的情況下將從Facebook登錄(laravel/socialite)生成的JWT發送到angularjs前端的適當方式是什麼?無會話使用laravel socialite和jwt-auth

長版本 我正在製作一個具有angularjs前端和laravel 5.2後端的應用程序。我正在使用tymondesigns/jwt-auth進行身份驗證而不是會話。

我也使用laravel/socialite進行社交Facebook身份驗證。爲此,我使用社交名稱的無狀態功能,以便我不需要以任何方式進行會話。

基本驗證完美。但是,當我嘗試使用Facebook登錄,我請按照下列步驟

  1. 用戶點擊的角度側重定向到後端的供應商登錄頁面的按鈕。

public function redirectToProvider() { return Socialite::with('facebook')->stateless()->redirect(); } 2.用戶給出他的登錄信息。登錄後,他被重定向到我的手回鎖功能。

 try { 
     $provider = Socialite::with('facebook'); 

     if ($request->has('code')) { 
      $user = $provider->stateless()->user(); 
     } 

    } catch (Exception $e) { 
     return redirect('auth/facebook'); 
    } 

    return $this->findOrCreateUser($user); 
  • 接下來,我使用findorcreate函數來確定用戶是否存在。如果不是,我只需創建一個新用戶並從中創建JWT。

    $user = User::where('social_id', '=', $facebookUser->id)->first(); 
    
    if (is_object($user)) { 
        $token = JWTAuth::fromUser($user); 
        return redirect()->to('http://localhost:9000/#/profile?' . 'token=' . $token);#angular 
    } else { 
        $result = array(); 
        $result['name'] = $facebookUser->user['first_name'] 
        $result['email'] = $facebookUser->user['email']; 
        $result['social_id'] = $facebookUser->id; 
        $result['avatar'] = $facebookUser->avatar; 
        $result['gender'] = $facebookUser->user['gender']; 
        $result['status'] = 'active'; 
        $result['login_type'] = 'facebook'; 
        $result['user_type'] = 'free_user'; 
    
        try { 
         $user = User::create($result); 
        } catch (Exception $e) { 
         return response()->json(['error' => 'User already exists.'], HttpResponse::HTTP_CONFLICT); 
        } 
        $token = JWTAuth::fromUser($user); 
        return redirect()->to('http://localhost:9000/#/profile?' . 'token=' . $token);#angular 
    } 
    
  • 我的問題是,在我將不得不通過URL的智威湯遜發送給我的前端代碼的最後一塊。這根本不安全。如果不使用會話,將生成的JWT發送到前端的正確方法是什麼?謝謝

    +0

    你解決這個問題?同樣的問題也在我們的應用程序中找到了。 – mtpultz

    +0

    將標記存儲在cookie中也不是一個壞主意。在你的回調處理程序中,你應該設置一個帶有令牌的cookie。 –

    回答

    1

    如果你對角端使用$http,試圖返回令牌從Laravel的JSON響應:

    return response()->json(compact('token')); 
    

    然後令牌存儲在localStoragesessionStorage或者你有什麼。

    如果您從Laravel內部生成Angular頁面(例如,不使用Laravel作爲API,但是例如從/public/index.php顯示您的Angular頁面),則可以使用視圖數據中的令牌加載視圖。

    只要您使用的是HTTPS,這兩種情況中的任何一種都比在重定向URL中傳遞令牌更好。

    +0

    感謝您的回覆。 Laravel被用作API。 用戶在進入Facebook登錄頁面時已經離開了角度網站。所以,作爲迴應返回令牌不會達到角度。 –

    1

    official documentation of Laravel Socialite說:

    無國籍認證

    stateless方法可以用於禁用會話狀態驗證。這一個API添加社交身份驗證時非常有用:

    return Socialite::driver('google')->stateless()->user(); 
    

    然後,您可以使用jwt-auth方法鑑別:

    JWTAuth::fromUser($user)