在现代 web 应用中,用户的身份认证和授权非常重要。在前端领域中,通常使用 token 和 cookie 进行用户的身份认证和授权。在本文中,我们将使用 Next.js 和 Redux 实现登录授权的本地存储和 cookie 管理。
使用 Next.js 创建应用
Next.js 是一个 React 框架,可以轻松创建服务器渲染的 web 应用。我们可以使用 create-next-app
命令创建新的 Next.js 应用。执行以下命令:
--- --------------- ------
然后进入 my-app
目录,并使用以下命令启动应用:
--- --- ---
这些命令将创建一个基本的 Next.js 应用,并启动开发服务器。
实现登录和授权
使用 Redux 管理应用状态,可以轻松实现登录和授权。Redux 是一个可预测的状态容器,可以在应用程序中存储应用程序的状态,并使用 actions 和 reducers 更新和查询该状态。
实现 Redux store
首先,我们需要实现 Redux store。在 Next.js 应用中,我们可以使用 configureStore
函数创建 Redux store。在 store.js
文件中添加以下代码:
------ - -------------- - ---- ------------------ ------ ----------- ---- ------------- ------ ----- ----- - ---------------- -------- - ----- ------------ -- --
我们使用 configureStore
函数创建 Redux store,并将 authReducer
添加到 reducer 中。
实现登录和授权功能
接下来,我们将实现登录和授权功能。在 authSlice.js
文件中添加以下代码:
------ - ----------- - ---- ------------------ ------ ----- --------- - ------------- ----- ------- ------------- - ---------------- ------ ----- ----- -- --------- - -------- ------- ------- -- - --------------------- - ---- ---------- - -------------- -- ---------- ----- -- - --------------------- - ----- ---------- - ---- -- -- -- ------ ----- - -------- --------- - - ----------------- ------ ------- -----------------
在 authSlice.js
文件中,我们创建了一个名为 auth
的 slice,并导出了两个 action:setUser
和 clearUser
。setUser
将用户设置为已认证状态,并将用户信息存储在状态中。clearUser
将用户设置为未认证状态,清除存储的用户信息。
我们还将 authSlice
reducer 导出为默认导出。
实现登录页面
接下来,我们将实现登录页面。在 pages/login.js
文件中添加以下代码:
------ - -------- - ---- ------- ------ - ----------- - ---- ------------- ------ - --------- - ---- ------------- ------ - ------- - ---- ------------------- ------ ------- -------- ----------- - ----- ---------- ------------ - ------------ ----- ---------- ------------ - ------------ ----- -------- - ------------- ----- ------ - ----------- ----- ------------ - ----- - -- - ------------------ -- --------- --- --- ------------- ----- ---- - ----- ----------- --------- -------- -- ----------------------- ---------------- - ------ - ----- ------------------------ ------ ----------- ---------------- ----------- -- ---------------------------- -- ------ --------------- ---------------- ----------- -- ---------------------------- -- ------- ---------------------------- ------- - -
在 Login 页面中,我们使用 useState
钩子来处理表单数据。然后我们使用 useDispatch
钩子来调度 setUser
action 并将用户登录信息存储到 Redux store 中。我们还使用 useRouter
钩子来推进用户到主页。
实现授权组件
最后,我们将实现授权组件,用于确定用户是否已登录。在 components/requireAuth.js
文件中添加以下代码:
------ - ----------- - ---- ------------- ------ - --------- - ---- ------------- ------ ------- -------- ------------- -------- -- - ----- --------------- - ----------------- -- --------------------------- ----- ------ - ----------- -- ------------------ - --------------------- ------ ---------------- -- -------------- - ------ -------- -
在 RequireAuth
组件中,我们使用 useSelector
钩子从 Redux store 中选择 isAuthenticated
状态。如果用户没有被认证,则重定向到登录页面。否则,该组件显示传递给它的 children。
本地存储和 cookie 管理
在上一步中,我们实现了登录和授权的基本功能。但是在客户端下一次访问应用程序时,应该如何告诉服务器用户已经被认证过了呢?这就需要用到本地存储和 cookie 管理。
实现本地存储
我们使用浏览器的本地存储来存储用户的登录信息。在 store.js
文件中添加以下代码:
------ ----- --------- - ----- -- - --- - ----- --------------- - --------------------- ----------------------------- ---------------- - ----- ----- - ---------------- - - ------ ----- --------- - -- -- - --- - ----- --------------- - ----------------------------- -- ---------------- --- ----- - ------ --------- - ------ --------------------------- - ----- ----- - ------ --------- - - ------------------ -- - ----------- ----- --------------------- -- --
我们添加了两个函数:saveState
和 loadState
。saveState
在每次状态变化时将状态存储到本地存储中。loadState
从本地存储中加载状态。
实现 cookie 管理
我们使用 cookie 技术来存储用户的登录信息。在客户端发出请求时,它会将 cookie 发送到服务器。在服务器上,它可以将 cookie 与会话(如果会话存在)相关联。
我们将使用 js-cookie
库来管理 cookie。我们可以使用 setCookie
函数将 cookie 存储到客户端,使用 getCookie
函数从客户端获取 cookie。
在 utils/cookie.js
文件中添加以下代码:
------ ------- ---- ----------- ------ ----- --------- - ------ ------ ------- - --- -- - ----------------- ------ -------- - ------ ----- --------- - ------ ------- - --- -- - ------ ----------------- -------- - ------ ------- - ---------- ---------- -
实现服务端 cookie 管理
为了在服务器端管理 cookie,我们需要使用 cookie-parser
中间件解析 cookie。在 pages/api/login.js
文件中添加以下代码:
------ - --------- - ---- ---------------- ------ ------------ ---- --------------- ------ ----- ------ - - ---- - ----------- ------ -- - ------ ------- ----- ----- ---- -- - ----- - --------- -------- - - -------- -- ------------ ---- ----- ---- - ----- -------------------------- --------- -- ------ - -- --- ---- ------ ----------------- --------------------- - --------- ---- -- -------------- - --- -------------- - ---- - -------------- - --- ---------- -------- ---------- -------- -- --------- -- - - ------ ----- ---------- - ----------------
我们添加了 config
对象来配置 bodyParser
,并确保不会解析 POST 请求的正文。我们还使用 cookie-parser
中间件来解析 cookie。
在登录过程中,我们调用 setCookie
函数将 user 对象存储为 cookie。我们还将 httpOnly
属性设置为 true
,以确保 cookie 只能通过 HTTP 传输。在 middleware
导出中,我们将 cookie-parser
中间件添加到 API 端点中。
实现客户端 cookie 管理
在客户端,我们调用 getCookie
函数从 cookie 中获取 user
对象。在 pages/_app.js
文件中添加以下代码:
------ - --------- - ---- ------- ------ - ----------- - ---- ------------- ------ - ------- - ---- ------------------- ------ - --------- - ---- ---------------- -------- ------- ---------- --------- -- - ----- -------- - ------------- ----- ---------- - ----------------- ------------ -- - -- ------------ - ----------------------------------------- - -- --- ------ ---------- -------------- -- - ------ ------- -----
在 _app.js
文件中,我们使用 useEffect
钩子来检查是否存在 user
cookie,如果存在则将其存储在 Redux store 中。
总结
在本文中,我们使用 Next.js 和 Redux 实现了登录授权的本地存储和 cookie 管理。我们还介绍了如何使用浏览器的本地存储和 cookie,以及如何管理客户端和服务器端的 cookie。
实现登录和授权功能是任何 web 应用的关键功能之一。使用 Next.js 和 Redux,我们可以轻松实现这些功能,同时确保数据的安全和保密性。在实际应用中,我们需要根据实际需要和要求来实现登录和授权功能。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64784722968c7c53b0486dab