无法让设计从 Angular.js 中注销

Posted

技术标签:

【中文标题】无法让设计从 Angular.js 中注销【英文标题】:Cannot make Devise to log out from Angular.js 【发布时间】:2013-03-11 01:31:11 【问题描述】:

我通过 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方法后立即过期?!

【问题讨论】:

你注销了吗route a :get route in devise.rb? @shicholas:当然 Rails cookie 或 ng cookie 怎么样? 【参考方案1】:

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

我的会话控制器

$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 的行。

【讨论】:

现在删除$cookieStore.remove 调用,看看它是否真的在服务器端注销。顺便说一句:Devise 没有名称为 _pf_session_pf_name_pf_email 的 cookie 这两个系统并行运行,并且只通过 JSON 相互通信。登录时,Angular 会在浏览器中创建 pf_sessionpf_namepf_email cookie。服务器只是确保没有授权没有设计生成令牌的请求。如果发送了未经授权的请求,我使用Witold's HTTP Interceptor 让我的客户端应用程序在未经授权的请求时触发。然而,在昨晚与我的 ruby​​ 小组交谈后,可能存在一些 CSRF 问题,我应该使用 rails cookie。等我弄明白了再发帖。

以上是关于无法让设计从 Angular.js 中注销的主要内容,如果未能解决你的问题,请参考以下文章

并发请求未完成时无法注销设计用户

如何使用 Angular 和 Jasmine 模拟 socket.io

angular js 初学

从 MongoDB 在 Angular.js 中显示图像

Vue-第一天vue.js与MVVM设计模式

十个由浅入深的Angular.js面试问题