2015-02-11 71 views
3

我已經得到以下設置: AngularJS for the Frontend,它向$ Laravel API發出$ http請求。 例如,在開始時,如果Laravel中的會話存在,mainCtrl請求會將用戶登錄到應用程序中。 我用郵差測試了API,它完美地工作。AngularJS和Laravel - CORS

我使用Laravel 5

我送一個JSON這樣

{ 
     "user":"user", 
     "password":"password" 
} 

和API檢查它是否是一個有效的,如果讓他返回一個訪問令牌。 它會將令牌和用戶標識寫入laravel會話。

使用rout/checkLogin檢查是否存在具有有效令牌的會話。這也適用於郵差。

這裏的兩個函數從laravel後端的登錄名和checkLogin:

public function login(){ 
     $user = User::where('email', '=', Input::get('login'))->first(); 
    if($user == null) 
     $user = User::where('login', '=', Input::get('login'))->first(); 
     if($user != null){ 
      if($user->password==sha1(Input::get('password'))){ 
      $token = new Token; 
      $token->userid = $user->id; 
      $token->token=self::getGUID(); 
      Session::put('user_id', $user->id); 
      Session::put('user_token', $token->token); 
      $token->save(); 
         return $token->token; 
       }else 
        return "Wrong username or password"; 
      }else 
      return "Wrong username or password"; 
    } 

    public function checkLogin(){ 
     $token =null; 
     if(Session::has('user_token')){ 
      $token = Session::get('user_token'); 
     } 
     if($token == null){ 
      $token = Input::get('token'); 
     } 
     if($token != null){ 
      $test = Token::where('token', '=', $token)->where('userid', '=', Session::get('user_id'))->first(); 
      return User::where('id', '=', $test->userid)->first(); 
     } 
     return "no session"; 
    } 

我知道是什麼做的是創造一些角度的功能得到這個工作真的。 當我打開我的網站時,它應該檢查用戶是否登錄。它實際上是否會觸發Login中的get功能。

example.factory('Login', function($http) { 
     return { 
       get : function() { 
         return $http({ 
          method: 'GET', 
          url: 'http://api.example.com/checkLogin', 
          headers: { 'Content-Type' : 'application/json' } 
         }); 
       }, 

       save : function(loginData) { 
         return $http({ 
           method: 'POST', 
           url: 'http://api.example.com/login', 
           headers: { 'Content-Type' : 'application/json' }, 
           data: loginData 
         }); 
       } 
     } 

}); 

它也似乎工作正常。在我的控制檯中,我看到「沒有會話」。如果我沒有登錄,應該可以。 所以我現在嘗試登錄。我運行保存功能從上面的登錄。與我的數據放在一起是這樣的:

$scope.logmein = function() { 
    loginData = { 
         'login' : $scope.login, 
         'password' : $scope.password 
       }; 
    Login.save(loginData) 
         .success(function(data) { 
          console.log(data); 
           Login.get() 
             .success(function(getData) { 
              console.log(getData); 
              if(data==="no session"){ 
               $scope.loggedin=false; 
              } 
              else{ 
               $scope.loggedin=true; 
              } 
             }); 

         }) 
         .error(function(data) { 
           console.log(data); 
         }); 
        } 

當我點擊提交我得到我的控制檯令牌像預期。現在一切都應該沒問題。爲了更新我的網站,我再次運行checkLogin功能。它現在應該讓我回到我的會話,但它說沒有會話。當我登錄時,會話應該放在一起。 我已經嘗試了很多小時來解決這個問題,但是很多次它給了我一個CORS錯誤,或者當沒有發現CORS錯誤時,它只是做了我剛剛解釋的內容。

我希望有人能找出原因。

+0

只是一個註釋...'header:{'Content-Type':'application/json'}'對GET請求沒有意義。你不是*發送* application/json到服務器,你從服務器接收它。 – 2015-02-11 21:24:10

+0

哦,對不起是我的錯。可悲的是它沒有解決問題 – Sebi55 2015-02-11 21:25:39

回答

1

你將需要設置「訪問控制允許來源」和「訪問控制允許的方法」在你的響應頭:

<?php 
header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); 
?> 

編輯

在lavarel可能設立在所有響應頭中找到下面的代碼在這個要點https://gist.github.com/eweap/1df3b1662a500857133a

<?php namespace App\Http\Middleware; 
use Closure; 

use Illuminate\Contracts\Routing\Middleware; 
use Illuminate\Http\Response; 

class CORS implements Middleware { 

/** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
public function handle($request, Closure $next) 
{ 
    return $next($request)->header('Access-Control-Allow-Origin' , '*') 
      ->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE') 
      ->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With'); 
} 
} 

您將需要設置這個中間件Kernel.php

+0

我到底需要指定它嗎?我已經安裝了barryvdh/laravel-cors,因爲我認爲可能存在cors問題。 – Sebi55 2015-02-11 21:26:36

+0

你可以請嘗試返回響應() - >標題('訪問控制允許來源','*') - >標題('訪問控制允許方法','POST,GET,OPTIONS');螞蟻你的方法結束 – botero 2015-02-11 21:33:32

+0

我仍然有同樣的問題。我得到一個像預期的令牌,但是當問什麼令牌會話已經得到時,它告訴我我的會話中沒有令牌。爲了澄清新的令牌寫入我的數據庫,但是當我觸發新的checkLogin請求時,它說我的會話中沒有令牌。 – Sebi55 2015-02-11 21:38:45