【问题标题】:Stateless app - How to know if user is authenticated to show page无状态应用程序 - 如何知道用户是否已通过身份验证以显示页面
【发布时间】:2018-11-26 12:47:56
【问题描述】:

假设我有一个带有 Spring REST API 的 React 应用程序,并且我使用基于令牌的身份验证。现在,假设我也使用 React-Router 进行导航。

我想保护应用程序的某些页面只对登录用户可见。

如果用户通过身份验证,我打算在每次页面更改时询问我的服务器(执行获取请求),然后提供适当的数据。如果没有,请重定向到登录

我相信这是确保我的用户通过身份验证来查看页面的正确方法,但是还有更好的方法吗?恐怕对每一页的调用都很重。其他无状态的 Rest API 是如何处理这种情况的?

提前致谢!

【问题讨论】:

  • 所有非授权用户应该无法访问的内容应该只在后端代码中 - 如果页面布局是公开的并且您只会通过 API 为授权用户发送数据,那么可以将页面布局包含在反应......虽然您不需要发送单独的请求来检查用户是否经过身份验证,只需将那些要求敏感数据的请求发送到令牌

标签: reactjs spring-rest stateless


【解决方案1】:

将令牌存储在本地存储或会话存储中,这样您只需对授权服务器进行一次初始调用。 https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API

【讨论】:

    【解决方案2】:

    我已经用 Laravel 后端和 VueJS 前端完成了这个实现。与 React 有点不同,但我认为有些东西是一样的。

    我使用了JWT (JSON Web Token),并创建了一个登录 API。如果用户通过登录 API 登录,则向用户发出令牌和响应。然后你的前端框架应该将令牌保存在 Cookie 或本地存储中。

    当您的应用想要从 API 检索数据时,每次都将令牌附加到请求标头。您可以以登录用户身份从后端中间件解密令牌。

    好的,这就是JWT 和后端的工作方式。回到您的问题,只要令牌未过期,您就可以轻松存储令牌并将其重新用作用户标识。

    打开前端页面后,向服务器 API 发送一个请求,至少一次检索用户的全名、帐户名或页面渲染所需的任何内容。 (相反,如果您已经将它存储在本地存储中,只需显示它。)

    由于令牌存储,您将知道用户是否登录。这样您就可以处理来自前端框架路由的一些私有的、仅限成员的页面。 但只是为了改善用户体验。在检索和返回敏感数据之前检查令牌是否有效和用户标识。

    【讨论】:

    • 我想到了这个解决方案,但我的问题是你怎么知道令牌是否过期?例如: 1)用户登录 2)在那里等待 15 分钟 3)然后尝试转到另一个页面 他的令牌在服务器中已过期,但客户端不知道。因此,客户端将在登录后看到该用户并呈现页面。
    • @klesgidis 您无法从前端知道。您必须将其发送到后端,然后解密令牌才能知道。假设有两种情况,首先,如果令牌过期并且不再有效,您的 API 应该响应令牌无效,然后处理重定向到登录页面或显示消息等情况。另一个,令牌无效但可以刷新,服务器应该发出一个新的,然后在标头内响应。然后,更新您保留的令牌并在下次使用新令牌。
    • 我已经看到了您更新的上下文,如果您设计了一个像 SPA(单页应用程序)这样的应用程序,并且 API 服务器是您从中获取数据的地方,并且您在检索数据之前已经检查了标识,请不要担心客人获得私人内容。好的,就像你说的,如果前端框架不小心渲染了私有组件,请不要担心,因为过期的令牌将无法通过身份检查,即使渲染了仅限成员的组件也不会响应私有数据。用户只会看到一个空白页面。您需要关心的只是用户体验 (UX)。
    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2022-09-29
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多