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
può sostituire impostare intestazioni di richiesta: "Accesso -Control-Allow-Origin: http: // localhost: 8100 "a" Access-Control-Allow-Origin: * "e riprova – Naitik
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
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