如何在页面刷新时发送OAuth2访问令牌?

3
我有一个Web应用程序,将使用OAuth2处理身份验证。身份验证后,Web应用程序获得令牌并可以访问资源。但是,如果用户刷新页面或关闭浏览器并稍后回来,则令牌会丢失,用户必须再次登录。这在用户体验方面非常糟糕。
此外,服务器端代码检查用户是否已登录,并仅在用户已登录时发送应用程序的主页面。如果没有登录,则会重定向到登录页面。
由于OAuth2令牌作为标头发送到服务器,因此当用户在地址栏中键入站点名称时,浏览器不会发送任何令牌。
我计划在cookie中发送访问令牌。这是一个合适的解决方案吗?
1个回答

1
如果您正在使用React,您可能希望将访问令牌设置为每个HTTP请求的默认标头,并在window.ready()或ComponentDidMount()生命周期挂钩上发送到API或服务器。
然后,完成此操作后,您可以在应用程序准备就绪时使用首选库(如axios)或Fetch开始获取数据。
要做到这一点,您只需在第一次将访问令牌保存在本地存储中,然后在window.ready()中检索它。 您将在App的容器组件或index.html文件中的脚本标签中执行此操作。
但是,这种解决方案不能使您能够为安全路由执行服务器端水合作,特别是如果您的数据来自独立的API。 当使用这些解决方案时,解决服务器端水合作的唯一方法是将用户访问令牌设置为URL中的查询字符串参数,这样即使不执行JavaScript,浏览器也可以将其传递给服务器;但是与此相关的存在明显的安全漏洞。
希望这可以帮助您,祝好。

当用户在浏览器地址栏中键入网站名称时怎么办?在这种情况下如何发送访问令牌? - zarax
我们在讨论安全路由。即将有公共路由,向用户呈现公开可用的数据,并且不需要访问令牌才能获取,以及需要访问令牌的私人路由。如果您的主页需要为用户获取受限数据,则我的建议是放弃服务器端数据获取这些路由并通过 AJAX 请求进行客户端获取。 在这种情况下,令牌将从本地存储中检索并作为标头发送到您的 HTTP 请求中。 - xechelonx
我需要在主页上获取访问令牌,这样用户可以直接进入应用程序,如果其会话继续。您建议我可以将令牌保存到本地存储中,因此没有理由不将其保存在cookie中。谢谢。 - zarax
在做出决定之前,我建议您阅读这篇文章:https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage - xechelonx
如果这个解决了你的问题,你能否接受这个答案呢?谢谢。 - xechelonx
不是我问题的答案。抱歉。 - zarax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接