无法让设计从 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_session
、pf_name
和 pf_email
cookie。服务器只是确保没有授权没有设计生成令牌的请求。如果发送了未经授权的请求,我使用Witold's HTTP Interceptor 让我的客户端应用程序在未经授权的请求时触发。然而,在昨晚与我的 ruby 小组交谈后,可能存在一些 CSRF 问题,我应该使用 rails cookie。等我弄明白了再发帖。以上是关于无法让设计从 Angular.js 中注销的主要内容,如果未能解决你的问题,请参考以下文章