2016-06-17 3 views
5

की आवश्यकता है यह प्रश्न डुप्लिकेट की तरह लग सकता है, लेकिन मैंने स्टैक ओवरफ्लो पर अन्य समान प्रश्नों में सभी चरणों का प्रयास किया है, लेकिन उनमें से कोई भी काम नहीं करता है। मैं आयनिक का उपयोग कर एक रेल एपीआई से कनेक्ट करने की कोशिश कर रहा हूं।पूर्ण 401 अनधिकृत अनुरोध को रीडायरेक्ट अनुरोधों के लिए अनुमति नहीं दी गई है, जिसके लिए प्रीफलाइट

मेरा सेटअप रेल 4, प्रमाणीकरण के लिए देवता, टोकन आधारित API अनुरोधों और मोबाइल ऐप के लिए आयनिक के लिए simple_token_authentication मणि है।

मैं डेयज़ सत्र नियंत्रक एपीआई के लिए सही उपयोगकर्ता नाम और पासवर्ड के साथ लॉगिन अनुरोध पास करके आयनिक से लॉगिन करने में सक्षम हूं और devise api के माध्यम से सफल लॉगिन के बाद टोकन प्राप्त कर सकता हूं।

उसके बाद, जब मैं एक प्राप्त क्वेरी पहुँच टोकन का उपयोग कर के साथ किसी भी नियंत्रक के सूचकांक तक पहुँचने का प्रयास: http://localhost:3002/api/categories?token=1098ccee839952491a4 या http://localhost:3002/api/employers?token=1098ccee839952491a4

प्रतिक्रिया वसीयत की एक sign_in पेज है। में रेल प्रवेश करें, तो यह

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) 

मुझे पता है मैं पार डेटाबेस में टोकन जाँच की है यकीन है कि के लिए टोकन सही है पता चलता है। इसके अलावा, मैंने रैक-कॉर्स मणि शामिल किया है और इसके लिए क्रॉस डोमेन अनुरोध के लिए किसी मूल की अनुमति देने के लिए कॉन्फ़िगर किया गया है।

मेरी application.rb में CORS प्रविष्टि इस

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 

तरह लग रहा है इस तरह आयनिक दिखता में controllers.js में GET अनुरोध: -

$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, 
       }); 
       }); 

अनुरोध के बाद शुरू किया जाता है, क्रोम डेवलपर कंसोल निम्नलिखित संदेश दिखाता है

XMLHttpRequest लोड नहीं कर सकता। अनुरोध को 'http://localhost:3002/users/sign_in' पर रीडायरेक्ट किया गया था, जो को क्रॉस-मूल अनुरोधों के लिए अनुमति नहीं है, जिसके लिए प्रीफलाइट की आवश्यकता होती है।

प्रतिक्रिया हेडर मैं सर्वर से प्राप्त

जनरल

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

प्रतिक्रिया हेडर

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 

अनुरोध हेडर है

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

आप अनुरोध हेडर सेट की जगह ले सकता API सर्वर करने के लिए कुकीज़ भेज देंगे: "प्रवेश -कंट्रोल-अनुमति-उत्पत्ति: http: // localhost: 8100 "से" एक्सेस-कंट्रोल-अनुमति-उत्पत्ति: * "और फिर कोशिश करें – Naitik

+0

आप क्वेरी पैरा के रूप में एक्स-एक्सएसआरएफ-टोकन हेडर और टोकन दोनों का उपयोग क्यों करते हैं? स्पष्ट रूप से यह एक कॉरस मुद्दा नहीं है, प्रमाणीकरण के साथ आपके नियंत्रक में कुछ गड़बड़ है। अगर यह सीओआरएस समस्या थी तो आपको जीईटी अनुरोध बिल्कुल नहीं दिखाई देगा। क्या आप अपना कोड 'एपी :: श्रेणियां नियंत्रक' – Chris

+0

में साझा कर सकते हैं http://stackoverflow.com/questions/34949492/cors-request-with-preflight-and-redirect-disallowed-workarounds/39728229#39728229 पर विवरण के लिए विवरण देखें इस के आसपास कैसे काम करें। जैसा कि ध्यान दिया गया है, रीडायरेक्ट पर यह प्रतिबंध अब spec में नहीं है लेकिन ब्राउज़र को spec परिवर्तन से मेल खाने के लिए अपने कार्यान्वयन को अपडेट करने की आवश्यकता है। – sideshowbarker

उत्तर

0

मैं Access-Control-Allow-Credentials:true हेडर के साथ संबंधित मुद्दे लगता है, इस प्रयास करें:

$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, 
 
       }); 
 
       });

यह रूप में अच्छी तरह

+0

उत्कृष्ट पकड़! प्रतिक्रिया शीर्षलेखों को पढ़ना इस मुद्दे के आसपास काम को समझने की कुंजी अधिक बारीकी से था। – ArkoD

0

इस

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/**' 
    ]); 

}); 

ब्राउज़र स्वचालित रूप से एक अजनबी यूआरएल आप डोमेन की अनुमति देनी से गुट संसाधन प्रयास करें।

संबंधित मुद्दे