2013-03-21 14 views
5
से लॉग आउट करने के वसीयत नहीं बनाई जा सकती

मैं के माध्यम से लॉग आउट करने के वसीयत प्रमाणीकरण किया जाता है, लेकिन यह इस Angular.js कोड का उपयोग कर लॉग आउट नहीं कर सके:Angular.js

$scope.logout = -> 
    $http.get('/users/sign_out').success -> 
    #If it does not redirect from 'editor' to 'login' then you haven't actually logged out 
    $location.path('editor') 

वसीयत के लॉगआउट व्यवहार करने लगता है यादृच्छिक रहें - कभी-कभी यह लॉग आउट हो जाता है, कभी-कभी नहीं। और यदि मैं ब्राउज़र के पता बार में /users/sign_out दर्ज करता हूं, तो यह हमेशा लॉग आउट होता है।

ठीक है, मैं वसीयत प्रमाणीकरण की लॉग बाहर बंद अनुरोध पोस्ट करने के लिए कैशिंग समस्याओं से छुटकारा पाने के और प्रयोग किया जाता Angular.js कोड निम्नलिखित:

$scope.logout = -> 
    $http.post('/users/sign_out').success -> 
    $location.path('editor') 

पहली बार यह लॉग आउट ठीक, हमेशा की तरह, लेकिन फिर मैं इसे लॉग आउट नहीं कर सका।

मैं देखना मेरे अपने विधि क्या होता है बनाने का फैसला किया:

match '/logout' => 'api#logout', :via => :post 

class ApiController < ApplicationController 
    before_filter :authenticate_user! 

    def logout 
    sign_out 
    if current_user 
     puts 'Has not signed out!' 
    else 
     puts 'Has signed out!' 
    end 
    head :ok 
    end 
end 

और पाया है कि sign_out के बाद current_user हमेशा नहीं के बराबर है, लेकिन फिर कुछ चमत्कार से कोणीय आवेदन ApiController के अन्य तरीकों का उपयोग करने में प्रबंधन करता है, और current_user शून्य नहीं है!

मुझे यह समझ में नहीं आता है। ठीक है, मान लीजिए कि कुछ अन्य HTTP अनुरोध का पालन कर सकते हैं, ठीक बाद (या साथ ही साथ) लॉगआउट अनुरोध के बाद, प्रमाणीकरण कुकी और डेविस री-लॉग इन पास करते हुए, लेकिन कुकी में पारित सत्र आईडी समाप्त नहीं होनी चाहिए sign_out विधि के कॉल के तुरंत बाद ?!

+0

क्या आपने अपना साइन_आउट किया [मार्ग ए: devise.rb में मार्ग प्राप्त करें?] (Http://stackoverflow.com/questions/6557311/no-route-matches-users-ign-out-devise-rails-3) – shicholas

+1

@ शिचोलस: बेशक – Paul

+0

रेल कुकीज़ या एनजी कुकीज़ के बारे में कैसे? – shicholas

उत्तर

2

खेद मैंने पहले कभी नहीं प्रतिक्रिया व्यक्त की, उम्मीद है कि इस मदद करता है

मेरे Sesisons नियंत्रक

$scope.signOutUser = function() { 
    $http.delete('/api/users/sign_out', { 
    auth_token: Session.currentUser // just a cookie storing my token from devise token authentication. 
    }).success(function(result) { 
    $cookieStore.remove('_pf_session'); 
    $cookieStore.remove('_pf_name'); 
    $cookieStore.remove('_pf_email'); 
    location.reload(true); // I need to refresh the page to update cookies 
    }).error(function(result) { 
    console.log(result); 
    }); 
} 

मेरे वसीयत सत्र नियंत्रक मैं

class SessionsController < Devise::SessionsController 
    before_filter :authenticate_user!, only: :destroy 

    def destroy 
    token = params[:auth_token] 
    @user = User.find_by_authentication_token(token) 
    @user.reset_authentication_token! 
    sign_out(@user) 
    render status: :ok, json: {message: "You have successfully logged out"} 
    end 
end 

आप देख सकते हैं overrode, मैं नहीं कर रहा हूँ रेल कुकीज़ का उपयोग करना और इस प्रकार मेरा जवाब संबंधित नहीं हो सकता है। अगर मैंने किया तो मैं संभवतः सत्र की तरह एक पंक्ति जोड़ूंगा [: user] = nil मेरी नष्ट कार्रवाई में।

+0

अब '$ cookieStore.remove' कॉल हटाएं और देखें कि यह वास्तव में सर्वर की तरफ लॉग आउट करता है या नहीं। बीटीडब्ल्यू: डेविस के नाम '_pf_session', '_pf_name',' _pf_email' – Paul

+0

समानांतर में चलने वाली दो प्रणालियों के साथ कोई कुकी नहीं है और केवल एक दूसरे से JSON के माध्यम से बात करते हैं। साइन-इन पर, कोणीय ब्राउज़र में 'pf_session',' pf_name' और 'pf_email' कुकीज़ बनाता है। सर्वर बस यह सुनिश्चित करता है कि एक तैयार जेनरन टोकन अधिकृत नहीं है। यदि एक अनधिकृत अनुरोध भेजा जाता है, तो मैंने अपने क्लाइंट साइड ऐप को अनधिकृत अनुरोध पर फ़्लिप करने के लिए [विटॉल्ड के HTTP इंटरसेप्टर] (http://witoldsz.github.io/angular-http-auth/) का उपयोग किया। हालांकि, कल रात मेरे रूबी समूह से बात करने के बाद कुछ सीएसआरएफ मुद्दे हो सकते हैं और मुझे रेल कुकीज़ का उपयोग करना चाहिए। जब मैं इसे समझता हूं तो मैं पोस्ट करूंगा। – shicholas