2016-07-27 18 views
0

Ich verwende laravel 5.2.Laravel get Auth Variable für beide - API-Token und Session-basierte Authentifizierung

Vor kurzem habe ich aktualisiert Auth Modul zu haben session basierte Authentifizierung für Web und api_token basierte Authentifizierung für externe API-Anrufe.

Jetzt finde ich Fehler bei der Verwendung Auth::id() und Auth::user(), wo ich api_token basierte Authentifizierung verwendet habe. Also bin ich gezwungen, stattdessen Auth::guard('api')->id() und Auth::guard('api')->user() Methoden zu verwenden.

Jetzt ist meine Frage, gibt es eine gemeinsame Methode, die ich für beide unabhängig von api_token basierte Authentifizierung oder session basierend verwenden kann? Was ist mit auth()->user() und auth()->id()?

Was ist, wenn ich die any-Methode für beide Authentifizierung verwende? Zum Beispiel wird methodA() in api_token basierte Authentifizierung sowie in session basierend auch verwendet, wie kann ich mit diesem Fall umgehen, wenn ich Auth Variable verwenden musste?

Antwort

1

Ich denke, dass Controller, die reguläre Anfragen (durch Session-basierte Authentifizierung) behandeln, sollten getrennt sein von API-Controller (Token-basierte Authentifizierung). Jeder Controller hätte also die Verantwortung für einen einzigen Teil der Funktionalität. Änderungen im API-Controller haben keine Nebenwirkung im Sitzungs-Controller. Daher können Sie auth guard explizit in jedem Controller angeben. Laravel erfordert explizit die Angabe von Guard, andernfalls wird Default Guard verwendet. Es gibt keine Möglichkeit, intelligent zu raten, welche Wache nativ verwendet werden soll. Natürlich können Sie so etwas wie dies machen:

public function action(Request $request) 
{ 
    $guard = $request->has('api_token') ? 'api' : 'session'; 
    $authUser = Auth::guard($guard)->user(); 

    //your code next 
} 

Wenn Sie mit separaten Controller gehen, werden Sie gemeinsame Funktionalität in übergeordneten abstrakte Controller verallgemeinern können. Beachten Sie, dass sich ChildControllers im folgenden Beispiel nur nach Namespace unterscheidet. Parent:

<?php 

namespace App\Http\Controllers\Api 

use App\Http\Controllers\Controller; 

abstract class ParentController extends Controller 
{ 
    public function action(Request $request) 
    { 
     $authUser = Auth::guard($this->guard)->user(); 

     //your code... 
    } 
} 

API-Controller:

<?php 

namespace App\Http\Controllers\Session 

use App\Http\Controllers\ParentController 

class ChildController extends ParentController 
{ 
    protected $guard = 'session'; 

    //your code... 
} 

Session Controller:

<?php 

namespace App\Http\Controllers\Api 

use App\Http\Controllers\ParentController 

class ChildController extends ParentController 
{ 
    protected $guard = 'api'; 

    //your code... 
}