2016-06-17 68 views
5

Questa domanda può sembrare un duplicato, ma ho provato tutti i passaggi nelle altre domande simili su StackOverflow ma nessuno di essi ha funzionato. Sto cercando di connettermi a un'API Rails utilizzando ionic.Completato 401 non autorizzato La richiesta è stata reindirizzata a cui non è consentito per le richieste di origine incrociata che richiedono il preflight

La mia configurazione è Rails 4, Devise per autenticazione, gemma simple_token_authentication per richieste API basate su token e ionic per app mobile.

Sono in grado di effettuare il login da ionic passando una richiesta di accesso con un nome utente e una password corretti all'API di devise controller di sessione e ottenere un token dopo aver effettuato il login con successo tramite l'API di sviluppo.

Dopo di che, quando provo ad accedere a qualsiasi indice del controller con una query get utilizzando il token di accesso: http://localhost:3002/api/categories?token=1098ccee839952491a4 o http://localhost:3002/api/employers?token=1098ccee839952491a4

La risposta è una pagina sign_in di escogitare. Nel log delle rotaie, mostra

Started GET "/api/categories?token=1098ccee839952491a43" for ::1 at 2016-06-17 17:45:55 +0530 
Processing by Api::CategoriesController#index as HTML 
    Parameters: {"token"=>"1098ccee839952491a43"} 
    User Load (0.7ms) SELECT `users`.* FROM `users` WHERE `users`.`authentication_token` = '1098ccee839952491a43' 
Completed 401 Unauthorized in 3ms (ActiveRecord: 0.7ms) 


Started GET "https://stackoverflow.com/users/sign_in" for ::1 at 2016-06-17 17:45:55 +0530 
Processing by Devise::SessionsController#new as HTML 
    Rendered devise/shared/_links.html.erb (6.5ms) 
    Rendered devise/sessions/new.html.erb within layouts/login (78.3ms) 
Completed 200 OK in 3850ms (Views: 3847.1ms | ActiveRecord: 0.0ms) 

che so per certo il token è corretto come ho un controllo incrociato il token nel database. Inoltre, ho incluso la gemma di rack-cors e la sua configurazione per consentire qualsiasi origine per la richiesta di dominio incrociato.

Nel mio application.rb voce cors assomiglia a questo

class Application < Rails::Application 
    config.active_record.raise_in_transactional_callbacks = true 

    config.middleware.insert_before 0, "Rack::Cors" do 
     allow do 
     origins '*' 
     resource '*', :headers => :any, :methods => [:get, :post, :options] 
     end 
    end 

    end 

La richiesta GET in controllers.js negli sguardi ionici come questo: -

$http({ 
     method: 'GET', 
     headers: 
     { 
      'X-XSRF-TOKEN': window.localStorage.getItem("token") , 
     }, 
     url: config.apiUrl+"/categories?token="+window.localStorage.getItem("token") , 
      }).then(function successCallback(response) { 
           console.log(response); 

       }, function errorCallback(response) { 
       $ionicPopup.alert({ 
        title: 'Alert', 
        template: response.data.message, 
       }); 
       }); 

Dopo la richiesta viene avviata, Chrome console dello sviluppatore mostra il seguente messaggio

XMLHttpRequest non può caricare http://localhost:3002/api/categories?token=1098ccee839952491a43. La richiesta è stata reindirizzata a "http://localhost:3002/users/sign_in", che non è consentita per per le richieste di origine incrociata che richiedono il preflight.

intestazioni di risposta che ricevo dal server è

generale

Request URL:http://localhost:3002/api/categories?token=1098ccee839952491a43 
Request Method:GET 
Status Code:302 Found 
Remote Address:[::1]:3002 

intestazioni di risposta

view source 
Access-Control-Allow-Credentials:true 
Access-Control-Allow-Methods:GET, POST, OPTIONS 
Access-Control-Allow-Origin:http://localhost:8100 
Access-Control-Expose-Headers: 
Access-Control-Max-Age:1728000 
Cache-Control:no-cache 
Connection:Keep-Alive 
Content-Length:101 
Content-Type:text/html; charset=utf-8 
Date:Fri, 17 Jun 2016 12:26:13 GMT 
Location:http://localhost:3002/users/sign_in 
Server:WEBrick/1.3.1 (Ruby/2.2.1/2015-02-26) 
Set-Cookie:_backend_session=c05LRTgzdXNVdGNFeHcwaDNtRDkxZ1RBbXFNaDFNbE1zMTV6OGhFZG1VODdON2k4ODN0ZTg3YXo5OU5hOTZkcUNmR3VTaGVRQzBOUElCNnMrODhnemVCbUhQbUs2azNHdmVnbFpoL2JiRDA5S1I4NCtsVWNhOEpqeDdoYWxXR3hHNDg5RzNRcUlpcDZ4QWswY2NmUlpYbUkvTnpaVEViNXh6ZExCZkNyTXA0allMcW1RVGg1MjRLVnpEbzlSSVk4dGRUSTNsTUZFNEFOcVJxdm1hWXNaSFEzdnlSN01DZ2FTdEJYUTdUUGxucU44cFBMbDZ6RXlhVUx2ZHArWlNCVWgyTWs2emRrSXNGbTQ3ZVVQL0NCR0E9PS0tbmFzajFXZnZnd25oUkRFRjhxSy81QT09--281b2bd6413653ca006abc80f13329d6bf3ad0f5; path=/; HttpOnly 
Vary:Origin 
X-Content-Type-Options:nosniff 
X-Frame-Options:SAMEORIGIN 
X-Request-Id:3097ec28-6d55-4c70-90c9-de221b4321e3 
X-Runtime:0.021444 
X-Xss-Protection:1; mode=block 

intestazioni di richiesta

view source 
Accept:application/json, text/plain, */* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Host:localhost:3002 
Origin:http://localhost:8100 
Referer:http://localhost:8100/ 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36 
X-XSRF-TOKEN:1098ccee839952491a43 
+0

può sostituire impostare intestazioni di richiesta: "Accesso -Control-Allow-Origin: http: // localhost: 8100 "a" Access-Control-Allow-Origin: * "e riprova – Naitik

+0

Perché usi sia l'intestazione X-XSRF-TOKEN che il token come parametro di query? Chiaramente questo non è un problema CORS, c'è qualcosa di sbagliato nel tuo controller con autenticazione. Se si trattava di problema CORS, non si vedrebbe affatto la richiesta GET. Puoi condividere il tuo codice in 'Api :: CategoriesController' – Chris

+0

Vedere la risposta su http://stackoverflow.com/questions/34949492/cors-request-with-preflight-and-redirect-disallowed-workarounds/39728229#39728229 per dettagli di come aggirare questo. Inoltre, come indicato in precedenza, questa restrizione sui reindirizzamenti non è più nelle specifiche, ma i browser devono aggiornare le loro implementazioni in modo che corrispondano al cambiamento delle specifiche. – sideshowbarker

risposta

0

Credo che il problema in relazione con Access-Control-Allow-Credentials:true intestazione, provate questo:

$http({ 
 
     method: 'GET', 
 
     withCredentials: true, 
 
     headers: 
 
     { 
 
      'X-XSRF-TOKEN': window.localStorage.getItem("token") , 
 
     }, 
 
     url: config.apiUrl+"/categories?token="+window.localStorage.getItem("token") , 
 
      }).then(function successCallback(response) { 
 
           console.log(response); 
 

 
       }, function errorCallback(response) { 
 
       $ionicPopup.alert({ 
 
        title: 'Alert', 
 
        template: response.data.message, 
 
       }); 
 
       });

invierà cookie al server API così

+0

Ottima presa! La lettura delle intestazioni di risposta più da vicino è stata la chiave per capire come risolvere il problema. – ArkoD

0

provare questo

app.config(function($sceDelegateProvider) { 
$sceDelegateProvider.resourceUrlWhitelist([ 
    // Allow same origin resource loads. 
    'self', 
    // Allow loading from our assets domain. Notice the difference between * and **. 
    'http://localhost:3002/**' 
    ]); 

}); 

Browser automaticamente risorsa blocco da un URL sconosciuto è necessario consentire dominio.