Laravel Sanctum - 登录用户最佳实践

Posted

技术标签:

【中文标题】Laravel Sanctum - 登录用户最佳实践【英文标题】:Laravel Sanctum - Logged in user best practise 【发布时间】:2020-11-12 05:35:09 【问题描述】:

我想知道检查用户是否仍在客户端登录的最佳做法是什么。

假设用户登录。如果成功,它将保存在状态中,如下所示:

axios.post('/login').then(() => 
  this.state.loggedInUser = true
);

现在,如果用户刷新浏览器,状态会丢失,但 laravel_sessionXSRF-TOKEN 仍然可用且有效。

在每次重新加载页面时添加中间件以请求检索当前登录用户的信息是否有意义?像这样?:

const authMiddleware = () => 
  axios.get('/user').catch(() => console.error('user is not logged in!'));
;

编辑

请注意,我在 SPA 模式下使用 Sanctum。所以没有令牌。

【问题讨论】:

你试过serverMiddleware吗?您可以访问req.headers 以提取会话。它使用连接实例,请查看***.com/questions/13147693/…。始终在服务器中运行令牌和其他敏感信息也是一种最佳做法。 serverMiddleware参考:nuxtjs.org/api/configuration-servermiddleware 【参考方案1】:

在我的 SPA 中使用 Vue 和 Vuex,我已经设法使用以下设置跟踪经过身份验证的用户:

store.js

store.js 跟踪 userisLoggedIn 状态。

import  isLoggedIn  from "./utils";
export default 
    state: 
        isLoggedIn: false,
        user: 
    ,
    mutations: 
        setUser(state, payload) 
            state.user = payload;
        ,
        setLoggedIn(state, payload) 
            state.isLoggedIn = payload;
        
    ,
    actions: 
        async loadUser( commit, dispatch ) 
            if (isLoggedIn) 
                try 
                    const user = (await axios.get("/user")).data;
                    commit("setUser", user);
                    commit("setLoggedIn", true);
                 catch (error) 
                    console.log(error)
                
            
        
    
;

utils.js

utils.js 包含用于从本地存储设置和获取登录状态的助手。

  
export function isLoggedIn() 
    return localStorage.getItem("isLoggedIn") == "true";


export function logIn() 
    localStorage.setItem("isLoggedIn", true);

登录.vue

在 login.vue 中,我从 utils.js 调用 logIn() 来设置 LocalStorage 中的 isLoggedIn 值。

另外,loadUser 操作正在被调度以在 Vuex 存储中设置用户信息。

<script>
import  logIn  from "../utils";
 methods: 
        async login() 
            try 
                await axios.get("/sanctum/csrf-cookie");
                await axios.post("/login", 
                    email: this.email,
                    password: this.password
                );
                logIn();
                this.$store.dispatch("loadUser");
                this.$router.push('/');
             catch (error) 
                console.log(error);
            
        
    
</script>

App.js

loadUser 操作也将在此处发送,以使登录后的用户信息在全球范围内可用。

const app = new Vue(
    ...
    async beforeCreate() 
        this.$store.dispatch("loadUser");
    
);

【讨论】:

【参考方案2】:

将其存储在 sessionStorage 中,并将 sessionStorage 中的 loggedInUser 初始化为:

sessionStorage.getItem('loggedInUser') === 'true' || false

【讨论】:

以上是关于Laravel Sanctum - 登录用户最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Laravel sanctum 获得合适的用户

如何选择使用 Laravel Sanctum 进行身份验证?

Laravel 7 Vue 2 Sanctum 登录错误 419; CSRF 令牌不匹配

使用 nuxtjs 登录 laravel sanctum 后出现 401(未验证)错误

Laravel Sanctum 令牌()未定义

Laravel Sanctum 无法使用 Postman 登录