2013-03-08 16 views
8

Używam Devise do uwierzytelniania użytkownika w aplikacji Rails. Próbowałem użyć AngularJS zamiast domyślnego rusztowania szyn w aplikacji. Problem polega na tym, że po dodaniu pliku before_filter: authenticate_user! w kontrolerze wywołania AngularJS, aby zaktualizować/zapisać i usunąć zasób, nie działa mówiąc Nieautoryzowany dostęp (401). Oto niektóre z kodu:Błąd uwierzytelniania przy użyciu Rails - Devise i AngularJS

Zasób:

@app.factory "employeesDB", ($resource) -> 
    $resource("/employees/:id", {id: "@id"}, {update: {method: "PUT"}}, 
    {destroy: {method: "DELETE"}} 
) 

Zapisuj działania:

$scope.saveEmpl = -> 
    $scope.em = new Object if !$scope.em 
    employeesDB.save({}, $scope.em, (resource) -> 
     $scope.employees.push(resource) 
    , (response) -> 
     console.log("Failed") 
    ) 

$ scope.em jest obiektem zawierającym dane na płycie i to wiążą się kątowe za pomocą modelu ng.

Wszystko działa idealnie, jeśli usunę filtr before_filter: authenticate_user! od kontrolera

class EmployeesController < ApplicationController 
    #before_filter :authenticate_user! 

Problem występuje tylko wtedy, gdy próbuję zapisać/zaktualizować/usunąć rekord, tylko odczytywanie działa poprawnie.

Jakieś pomysły? Czy są jakieś konkretne linie pomocnicze, które powinienem stosować podczas używania Angular i Devise? Jestem początkującym na szynach i angularJS, więc szczegółowe wyjaśnienie będzie bardzo mile widziane! Dzięki

+0

Czy próbowałeś przekazać parametr 'withCredentials' do domyślnych wartości $ httpProvider? 'app.config (['$ httpProvider', funkcja ($ httpProvider) {$ httpProvider.defaults.withCredentials = true;}]);'? – Stewie

+0

Dodano następujące elementy, ale niestety to nie zadziałało. Pojawia się ten sam problem. @ App = angular.module ("Mathra", ["ngResource"]). Config (['$ httpProvider', ($ httpProvider) -> $ httpProvider.defaults.withCredentials = true ]) – jkotzi

Odpowiedz

10

Możesz dodać to do Twojego app.js:

myApp.config([ 
    "$httpProvider", function($httpProvider) { 
    $httpProvider.defaults.headers.common['X-CSRF-Token'] = angular.element('meta[name=csrf-token]').attr('content'); 
    } 
]); 

które dodają CSRF token do wszystkich kątowe żądań.

EDYTOWANIE: Teraz niezależne jQuery (użyj jqLite).

Powiązane problemy