【问题标题】:How to persist jsonwebtoken on page reload after deploying react app部署反应应用程序后如何在页面重新加载时保留 jsonwebtoken
【发布时间】:2018-09-26 16:16:05
【问题描述】:

我的反应应用程序的索引页面中有此代码:

import React from 'react'
import ReactDOM from 'react-dom'
import {Provider} from 'react-redux'
import Router from './routes'
import {createStore, applyMiddleware, compose} from 'redux'
import thunk from 'redux-thunk'
import rootReducer from './rootReducer'
import setAuthorizationToken from './utils/setAuthorizationToken'
import {setCurrentUser} from './actions/loginActions'
import jwt from 'jsonwebtoken'

const store = createStore(rootReducer, compose(applyMiddleware(thunk), window.devToolsExtension ? window.devToolsExtension() : f => f))


if (localStorage.jwtToken) {
    setAuthorizationToken(localStorage.jwtToken)
    store.dispatch(setCurrentUser(jwt.decode(localStorage.jwtToken)))
}


ReactDOM.render(
    <Provider store={store}>
        <Router/>
    </Provider>, document.getElementById('root'))

其基本思想是使用令牌作为在服务器上验证客户端请求的一种形式。因此,来自客户端的每个请求都必须在标头中有一个令牌,服务器将对其进行解码和身份验证。我遵循的教程在“if”语句中添加了代码,如下所示(也在上面的代码 sn-p 中),以确保即使重新加载页面,本地存储仍然保留此令牌:

  if (localStorage.jwtToken) {
    setAuthorizationToken(localStorage.jwtToken)
    store.dispatch(setCurrentUser(jwt.decode(localStorage.jwtToken)))
}

从create-react-app 为您提供的开发服务器运行应用程序可以正常工作。我可以从任何 URL 重新加载页面,例如“/”或“/profile”等,并且令牌仍然可用。只有当我注销时,令牌才会被删除。 当我运行 npm build 创建一个生产就绪的单个 js 文件时出现问题,然后我在我的 html 文件中引用该文件。从不是“/”的任何其他 url 重新加载浏览器会引发“未提供令牌”的错误(这是来自我的节点服务器的自定义错误消息,当请求没有附加令牌时我想抛出该错误消息)。这仅仅意味着当我重新加载页面时浏览器会删除这个令牌。如何以与开发服务器相同的方式将此令牌持久保存在生产 js 文件中?

【问题讨论】:

    标签: javascript node.js reactjs redux jwt


    【解决方案1】:

    您可能错误地使用了 localStorage。 实际上,要在 localStorage 上设置密钥,您可以:

    localStorage.setItem('jwtToken', 'my-token-here')
    

    然后,恢复它:

    localStorage.getItem('jwtToken')
    

    如果您想在浏览器关闭的情况下保留数据,则本地存储是正确的选择。 否则,如果您希望数据丢失,则应使用 SessionStorage API。

    祝你好运。

    【讨论】:

    • 我按照你的建议设置了令牌,甚至用你的建议来恢复它,正如我在问题中提到的,在反应从端口 3000 开始的开发服务器中,一切都很好..检查浏览器中的存储选项卡,令牌被持久化并且在任何 url 重新加载页面仍然有效,但是当我为生产构建应用程序时,浏览器会在重新加载时删除令牌:(
    • 真的很奇怪,如果您删除所有内容并对其进行原始测试,怎么样。 import React from 'react' import ReactDOM from 'react-dom' import Router from './routes' localStorage.setItem('jwtToken', 'my-token-here') ReactDOM.render( &lt;Router/&gt; , document.getElementById('root')) 构建并测试。它是否将 my-token-here 保存在您的 localStorage 中?
    • 我使用create-react-app 创建了一个新的反应应用程序,这肯定需要一些时间来设置所有内容,同时,您的代码应该可以工作..因为它也在我的项目中工作。这是因为当 url 位于 '/' 时,索引处的代码是正在执行的代码,但是当您导航到其他 url 时,代码不会运行......因此在这些其他 url 处重新加载,设置项目的代码是未执行
    • 即使这样,它也应该可以工作。如果您尝试在页面之间的公共组件中执行此操作怎么办?
    • 我用create-react-app 创建了一个新的骨架应用程序,并且只添加了 2 个路由:'/' 和 '/profile'。在开发服务器上,它创建令牌并将其保存在两个 url 中,但在构建应用程序后可怕地拒绝工作。它只在'/'中创建令牌,但在'/profile'中浏览器删除了令牌......这令人沮丧
    猜你喜欢
    • 2018-03-18
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多