5

我通过 GET 进行了 Devise 身份验证以注销,但无法使用以下 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')

Devise 的注销行为似乎是随机的——有时会注销,有时不会。如果我进入/users/sign_out浏览器的地址栏,它总是会注销。

好的,我将 Devise 身份验证的注销切换为 POST 请求以消除缓存问题并使用以下 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为 nil,但随后 Angular 应用程序奇迹般地设法访问了 ApiController 的其他方法,并且 current_user 不在那里!

我不明白这个。好的,让我们假设在注销请求之后(或同时)可能会跟随其他一些 HTTP 请求,通过身份验证 cookie 并设计重新登录,但在 cookie 中传递的会话 ID 不应该立即过期调用sign_out方法后?!

4

1 回答 1

2

对不起,我之前没有回复过,希望这会有所帮助

我的会话控制器

$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

如您所见,我没有使用 Rails cookie,因此我的回答可能不适用。如果我这样做了,我可能会在我的销毁操作中添加类似 session[:user] = nil 的行。

于 2013-06-12T21:27:34.663 回答