如何使用基于会话的身份验证来确定用户是否仍在登录

How to find out if user is still logged in using session based authentication?

本文关键字:用户 是否 登录 身份验证 于会话 何使用 会话      更新时间:2023-09-26

我知道这个问题已经被问了无数次,但我找到的答案都没有描述到后端的实际连接。

我有一个一页的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以适当的方式做出反应。在需要身份验证的情况下,我们重定向到登录页面,您可以根据需要执行任何操作。它对我们来说工作得很好。