2014-10-08 4 views
5

Tworzę aplikację przy użyciu Laravel i budując mały wewnętrzny interfejs API, aby połączyć się z interfejsem Angular.Angular Auth przeciwko backrunkowi Laravel

Mam autoryzację, ale chciałem się upewnić, że jest to akceptowalny sposób zalogowania się użytkownika i upewnić się, że wszystko jest bezpieczne.

Sesje Kontroler:

public function index() { 
    return Response::json(Auth::check()); 
} 


public function create() { 
    if (Auth::check()) { 
     return Redirect::to('/admin'); 
    } 
    return Redirect::to('/'); 
} 

public function login() { 

    if (Auth::attempt(array('email' => Input::json('email'), 'password' => Input::json('password')))) { 
     return Response::json(Auth::user()); 
     // return Redirect::to('/admin'); 
    } else { 
     return Response::json(array('flash' => 'Invalid username or password'), 500); 
    }  
} 

public function logout() { 
    Auth::logout(); 
    return Response::json(array('flash' => 'Logged Out!')); 
} 

laravel Trasa:

Route::get('auth/status', '[email protected]'); 

kątowa fabryczne:

app.factory('Auth', [ "$http", function($http){ 


var Auth = {}; 

Auth.getAuthStatus = function() { 
    $http({ 
     method: "GET", 
     url: "/auth/status", 
     headers: {"Content-Type": "application/json"} 
    }).success(function(data) { 
     if(!data) { 
     console.log('Unable to verify auth session'); 
     } else if (data) { 
      console.log('successfully getting auth status'); 
      console.log(data);    

      // return $scope.categories; 
      Auth.status = data; 
      return Auth.status; 
     } 
    }); 

} 

return Auth; 

} 

]); 

bym wtedy zasadniczo owinąć całą aplikację w coś jak "appController" i zadeklaruj fabrykę "Auth" jako zależność. Następnie mogę wywołać Auth.getAuthStatus() i ukryć/pokazać rzeczy na podstawie stanu użytkownika, ponieważ zasadniczo będzie to SPA.

Zdaję sobie sprawę, że muszę ukryć identyfikator URI/auth/status przed obejrzeniem/trafieniem przez kogokolwiek i zastanawiałem się, jak to zrobić. Rodzaj ogólnego pytania, ale jakikolwiek wgląd byłby bardzo doceniony. Dzięki.

Odpowiedz

9

Świetne pytanie. Odpowiedziałem już na to samo pytanie, więc powiem to samo.

Uwierzytelnianie jest nieco inne w SPA, ponieważ prawie całkowicie oddzielasz aplikację Laravel i Angular. Laravel dba o walidację, logikę, dane itp.

Gorąco polecam przeczytanie artykułu połączonego na dole.

Możesz użyć filtrów trasy Laravel, aby chronić trasy przed nieautoryzowanymi użytkownikami. Jednakże, ponieważ twoja aplikacja Laravel stała się teraz tylko punktem końcowym, framework frontend będzie robił duże podnośniki w zakresie uwierzytelniania i autoryzacji.

Po ustawieniu filtrów tras nie uniemożliwia to upoważnionym użytkownikom podejmowania działań, do których nie są uprawnieni.

Co mam na myśli powyższe jest na przykład:

Masz końcowy API/api/v1/Users/159/edytować

Punkt końcowy jest jednym z relaksującego 7 i może być służy do edycji użytkownika. Każdy inżynier oprogramowania lub programista wie, że jest to punkt końcowy RESTful, a jeśli jest autoryzowany przez aplikację, może wysłać żądanie z danymi do tego punktu końcowego.

Użytkownik chce, aby użytkownik 159 mógł wykonać to działanie, lub administratorzy.

Rozwiązaniem tego problemu są role/grupy/uprawnienia, jakkolwiek chcesz je nazwać. Ustaw uprawnienia użytkownika dla aplikacji w aplikacji Angular i może przechowywać te dane w wydanym tokenie.

Przeczytaj ten świetny artykuł (w AngularJS) o tym, jak poprawnie uwierzytelnić/autoryzować za pomocą frontendowych frameworków JavaScript.

artykułu: https://medium.com/opinionated-angularjs/techniques-for-authentication-in-angularjs-applications-7bbf0346acec

+0

Widziałem ten artykuł, po prostu nie dość zrozumieć na pierwszy rzut oka, jak pomocny i dobrze napisane jest.Dzięki pęczkuję Noah. – cpk

+1

Nie ma problemu, cieszę się, że mogłem pomóc. –

+0

Kolejne pytanie uzupełniające. Rozumiem, jak to wszystko działa, ale jak mogę zachować stan logowania między kartami przeglądarki lub nowymi oknami/nowszymi odwiedzinami? Czy po prostu sprawdziłbym obecność ciasteczek laravel w usłudze "Sesja". Wszystko zaczyna się klikać ... jeszcze raz dzięki – cpk