Laravel+SSR实现保存登录状态(步骤详解)

 3483

本篇文章给大家带来了关于Laravel+SSR的相关知识,其中主要介绍了有关Laravel SSR 下是如何保存登录状态的,感兴趣的朋友,下面一起来看一下,希望对大家有帮助。

基于 Laravel + Nuxt3 的在线 Demo(https://laravel-nuxt3.ruti.page/)

Laravel + SSR nuxt: 如何保存登录状态?

Laravel + 客户端渲染的 Vue 确实写起来比较快,但是我们有些时候确实很需要 SEO,比如说电商、门户网站、论坛;而且对于大型项目,相比起客户端渲染,服务器端渲染带来的首屏加载时间上的优势确实是碾压的。

但是很多同学卡在了 SSR 下如何保存登录状态 这个问题下面,即如何像传统的 PHP/JSP 页面那样,刷新页面后仍保有登录状态

准备工作

首先准备 2 个接口,一个是

  1. GET http://example.com/api/auth/user

用户获取当前登录用户信息

  1. POST http://example.com/api/auth/tokens

用于请求授权

这里有一个包含 GitHub OAuth 的完整例子 ? laravel-nuxt3-api,并且测试覆盖率是 100%


Laravel+SSR实现保存登录状态(步骤详解)


开始 SSR

Nuxt3

在 Nuxt3 中,可以很自由地创建一个 server only 的脚本,在 initial 整个 Nuxt App 时,可以在渲染 html 前执行这个 server only 的脚本,并在渲染 html 时使用其返回的结果。

我们可以在 plugins 下面创建一个 *.server.[js|ts] 的 server only 的脚本

plugins/init.server.js 

  1. import { defineNuxtPlugin } from '#app';
  2. import { useAuth } from '~/store/auth.js';
  3. function cookieFromRequestHeaders (key) {
  4.     const headers = useRequestHeaders(['cookie']);
  5.     if ('cookie' in headers) {
  6.         const cookie = headers.cookie.split(';').find(
  7.             c => c.trim().startsWith(`${key}=`)
  8.         );
  9.         if (cookie) {
  10.             return cookie.split('=')[1];
  11.         }
  12.     }
  13.     return '';
  14. }
  15. export default defineNuxtPlugin(async (nuxtApp) => {
  16.     const token = cookieFromRequestHeaders('token');
  17.     if (token) {
  18.         const auth = useAuth(nuxtApp.$pinia);
  19.         auth.setToken(token);
  20.         await auth.fetchUser();
  21.     }
  22. });

在 store/auth.js 定义管理全局状态的 pinia,并在其中发送异步请求

  1. import { defineStore } from 'pinia';
  2. import { useCustomFetch } from '~/composables/useCustomFetch.js';
  3. import cookie from 'js-cookie';
  4. export const useAuth = defineStore('auth', {
  5.     state: () => ({
  6.         _token: '',
  7.         _user: {},
  8.     }),
  9.     getters: {
  10.         token() {
  11.             return this._token;
  12.         },
  13.         user() {
  14.             return this._user;
  15.         },
  16.     },
  17.     actions: {
  18.         async fetchUser() {
  19.             const { data, error } = await useCustomFetch('/auth/user');
  20.             if (error.value) {
  21.                 this.reset();
  22.             }
  23.             else {
  24.                 this.setUser(data.value);
  25.             }
  26.         },
  27.         // ...
  28.     },
  29. });

注意: Nuxt3 中不推荐使用 axios 等第三方的 http 包,而是使用其内置的 useFetch()

完整的例子 ? laravel-nuxt3-web


Nuxt2

在 Nuxt2 中,不同于 Nuxt3,Nuxt2 只能在 store/index.js 中的 nuxtServerInit() 中运行 server only 的脚本(但是这里我们可以使用 axios)

store/index.js

  1. export const actions = {
  2.     nuxtServerInit({ commit, dispatch, route }, { req }){
  3.         const token = cookieFromRequest(req, 'token');
  4.         if (!!token) {
  5.             commit('auth/setToken', token);
  6.         }
  7.     }
  8. };

store/auth.js

  1. import Cookie from 'js-cookie';
  2. export const state = () => ({
  3.     user: null,
  4.     token: null
  5. });
  6. export const getters = {
  7.     user: state => state.user,
  8.     token: state => state.token,
  9.     check: state => state.user !== null
  10. };
  11. export const mutations = {
  12.     setToken(state, token){
  13.         state.token = token;
  14.     },
  15.     fetchUserSuccess(state, user){
  16.         state.user = user;
  17.     },
  18.     fetchUserFailure(state){
  19.         state.user = null;
  20.     },
  21.     logout(state){
  22.         state.token = null;
  23.         state.user = null;
  24.     },
  25.     updateUser(state, { user }){
  26.         state.user = user;
  27.     }
  28. }
  29. export const actions = {
  30.     saveToken({ commit }, { token, remember }){
  31.         commit('setToken', token);
  32.         Cookie.set('token', token);
  33.     },
  34.     async fetchUser({ commit }){
  35.         try{
  36.             const { data } = await this.$axios.get('/auth/user');
  37.             commit('fetchUserSuccess', data);
  38.         }catch(e){
  39.             Cookie.remove('token');
  40.             commit('fetchUserFailure');
  41.         }
  42.     },
  43.     // ...
  44. }



本文网址:https://www.zztuku.com/detail-13784.html
站长图库 - Laravel+SSR实现保存登录状态(步骤详解)
申明:本文转载于《learnku》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐