如何使用基于会话的身份验证来确定用户是否仍在登录
How to find out if user is still logged in using session based authentication?
我知道这个问题已经被问了无数次,但我找到的答案都没有描述到后端的实际连接。
我有一个一页的JS应用程序,它与小型后端(Django)API通信。我使用基于会话的身份验证。用户信息在第一次加载时缓存。如果会话过期,我需要更改页头并从缓存中刷新用户信息。然而,我的大多数API资源都是公共的,并且总是返回200。其他几个资源是私有的,如果用户没有登录,则返回403,这很好,因为这只会给我所需的信息。问题是,有些页面只能访问公共资源。万一会话在后台突然被删除,用户导航到只访问公共资源的url,用户信息不会被刷新,我就遇到了用户体验问题。
我最初的想法是在每次url更改时请求私有用户资源(让我们称之为/users/self/
),如果用户已通过身份验证,则返回200,如果用户未通过身份验证则返回403。然而,这需要在每个url更改的其他请求之前增加一个请求,这并不理想。
在这种情况下,我能用什么更简单的技巧吗?如果能解决问题的话,我甚至不介意切换到其他类型的身份验证。
对于此类场景,我所做和看到的是使用某种类型的http拦截器来拦截Angular完成的所有http请求,如果它发现响应状态为401,则此类拦截器会使用$rootScope
引发事件。
在此处查看一个库https://github.com/witoldsz/angular-http-auth
要使用它,需要使用某种类型的根控制器订阅引发的事件,它可以将用户重定向到登录页面。
请在此处查看示例https://medium.com/opinionated-angularjs/7bbf0346acec
如果会话没有过期,只需在每个请求中检查后端即可,而不是发送额外的身份验证请求。如果用户不是auth,则返回一个状态代码。
在angularjs中,我们使用了httpResponse拦截器,它拦截每个响应并检查该状态代码。
如果用户仍在登录,则无论请求的资源是否为公共资源,后端都可以向响应添加一个标头。客户端然后可以检查该报头的存在并相应地采取行动。
在双方,这都是通过某种过滤器或拦截器来完成的。在angular中,这将是一个$http拦截器。
我们在工作中按照别人已经告诉你的做:使用HttpInterceptor。
我们从后端发送的每个响应都以相同的方式构建:一个具有两个字段的对象:responseCode和实际的响应。我们根据后端发生的事情来更改responseCode,即成功、安全警报或给定操作所需的身份验证,这是最常见的情况。
然后,拦截器根据我们定义的每个responseCode以适当的方式做出反应。在需要身份验证的情况下,我们重定向到登录页面,您可以根据需要执行任何操作。它对我们来说工作得很好。
- 如何使用jquery确定用户是否年满18岁
- javascript跨浏览器确定用户是否滚动到页面底部
- javascript移动交叉浏览器确定用户是否滚动到页面底部
- 如何检查用户是否使用$routeChangeStart登录angularjs
- 如何检测用户是否在同一会话中打开了多个窗口或选项卡
- 询问用户是否要打开地理位置
- 检测用户是否具有打印功能
- 检查用户是否在Orchard CMS中获得授权
- HTML.如何检查用户是否在表单中输入了文本
- 如何检查用户是否开始关注
- 检查用户是否正在访问纯根url
- 检测用户是否有从其重定向的意图's页
- 如何发现用户是否使用jQuery滚动到HTML容器的末尾
- 使用jQuery检测用户是否退出全屏视频
- 检查用户是否具有角色分析云代码
- 如何检查用户是否已经在NodeJs-Mongoose中关注其他用户
- 检查请求的用户是否是django中的所有者
- 如何检测用户是否移动了滚动条
- Facebook JavaScript SDK 检查用户是否为粉丝(错误:指定的版本无效)
- 有没有办法检测用户是否真的远离计算机