【问题标题】:How to send OAuth2 access token on page refresh?如何在页面刷新时发送 OAuth2 访问令牌?
【发布时间】:2017-01-31 08:14:23
【问题描述】:

我有一个使用 OAuth2 处理身份验证的 Web 应用程序。身份验证后,Web 应用程序拥有令牌并可以访问资源。但是,如果用户刷新页面或关闭浏览器并稍后返回,则令牌丢失并且用户必须再次登录。这在用户体验方面非常糟糕。

此外,服务器端代码会检查用户是否已登录,并仅在用户已登录时发送应用程序的主页。如果未登录,则会重定向到登录页面。

由于 OAuth2 令牌作为标头发送到服务器,因此当用户在地址栏输入站点名称时,浏览器不会发送任何令牌。

我计划在 cookie 中发送访问令牌。这是一个合适的解决方案吗?

【问题讨论】:

    标签: javascript oauth-2.0


    【解决方案1】:

    如果您使用 React,您可能希望在 window.ready() 或 ComponentDidMount() 生命周期挂钩上将您的访问令牌设置为您发送到游览 API 或服务器的每个 HTTP 请求的默认标头。

    然后,完成此操作后,您可以开始使用您喜欢的库(如 axios)或 Fetch 在应用程序准备就绪时开始获取数据。

    为此,您只需第一次将访问令牌保存在本地存储中,然后在 window.ready() 上检索它。 您将在应用的容器组件或 index.html 文件中的脚本标记中执行此操作。

    但是,此解决方案不会让您能够为安全路由执行服务器端水合,尤其是当您的数据来自独立 API 时。 使用此类解决方案时解决服务器端水合的唯一方法是将用户访问令牌设置为 url 中的查询字符串参数,这样浏览器即使不执行 javascript 也可以将其传递给服务器;但存在与之相关的明显安全漏洞。

    希望这会有所帮助,干杯。

    【讨论】:

    • 用户在浏览器地址栏输入网站名称怎么办?这种情况下如何发送访问令牌?
    • 我们在这里讨论的是安全路由。也就是说,将有公共路由,向用户提供公开可用的数据,并且不需要获取访问令牌,而私有路由则需要。如果您的主页需要为用户获取受限数据,我的建议是您放弃为这些路由获取服务器端数据,并继续通过 AJAX 请求进行客户端获取。在这种情况下,令牌将从本地存储中检索并作为 HTTP 请求中的标头发送。
    • 我需要主页上的访问令牌,以便用户在会话继续时可以直接进入应用程序。您建议我可以将令牌保存到本地存储中,因此没有理由不保存在 cookie 中。谢谢
    • 建议您在做决定之前阅读这篇文章:stormpath.com/blog/…
    • 如果这解决了您的问题,您能接受答案吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2017-05-29
    • 2019-06-28
    相关资源
    最近更新 更多