首页 > 其他分享 >记 Laravel Sanctum 实现 token登录

记 Laravel Sanctum 实现 token登录

时间:2023-10-04 12:14:58浏览次数:29  
标签:Laravel use vue Sanctum token import php store

记 Laravel Sanctum 实现 token登录

  1. 假设已经安装好 Laravel

  2. 安装 Laravel Sanctum.

    composer require laravel/sanctum
    
    php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
    
    php artisan migrate
    
  3. 修改 ../app/Http/Kernel.php

    use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
    
    ...
    
        protected $middlewareGroups = [
            ...
    
            'api' => [
                EnsureFrontendRequestsAreStateful::class,
                'throttle:60,1',
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],
        ];
    
        ...
    ],
    
  4. 修改 ../app/User.php

    use Laravel\Sanctum\HasApiTokens;
    
    class User extends Authenticatable
    {
        use HasApiTokens, Notifiable;
    }
    
  5. 创建用户

    php artisan make:seeder UsersTableSeeder
    
    DB::table('users')->insert([
        'name' => 'John Doe',
        'email' => '[email protected]',
        'password' => Hash::make('password')
    ]);
    // into the run() function in database/seeds/UsersTableSeeder.php
    
    
    // To seed users table with user, let's run:
    php artisan db:seed --class=UsersTableSeeder
    
  6. routes/api.php 创建 路由 /login

    // ../routes/api.php
    
    use App\User;
    use Illuminate\Support\Facades\Hash;
    
    Route::post('/login', function (Request $request) {
        $data = $request->validate([
            'email' => 'required|email',
            'password' => 'required'
        ]);
    
        $user = User::where('email', $request->email)->first();
    
        if (!$user || !Hash::check($request->password, $user->password)) {
            return response([
                'message' => ['These credentials do not match our records.']
            ], 404);
        }
    
        $token = $user->createToken('my-app-token')->plainTextToken;
    
        $response = [
            'user' => $user,
            'token' => $token
        ];
    
        return response($response, 201);
    });
    
  7. /routes/api.php 文件中把 auth:api 替换成 auth:sanctum

    // ../routes/api.php
    
    Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
        return $request->user();
    });
    
  8. 修改 CORS 跨域

    // ../config/cors.php
    
        'paths' => ['api/*', 'login', 'logout'],
    
        'allowed_methods' => ['*'],
    
        'allowed_origins' => ['*'],
    
        'allowed_origins_patterns' => [],
    
        'allowed_headers' => ['*'],
    
        'exposed_headers' => [],
    
        'max_age' => 0,
    
        'supports_credentials' => true,
    
    
    // .env 文件
    SANCTUM_STATEFUL_DOMAINS=127.0.0.1
    
  9. Vue 请求时加上 Authorization

    // route/index.js
    import { createRouter, createWebHashHistory } from "vue-router"
    import store from '../store.ts'
    
    const routes = [
        {
            path: '/',
            component: () => import('@/components/AdminIndex.vue')
        },{
            path: '/admin',
            component: () => import('@/components/AdminIndex.vue')
        },{
            path: '/login',
            component: () => import('@/components/AdminLogin.vue')
        },
    ]
    if (sessionStorage.getItem("token")){
        store.commit("set_token", sessionStorage.getItem("token"))
    }
    
    export const router = createRouter({
        history: createWebHashHistory(),
        routes: routes
    })
    
    export default router
    
    
    // store.ts
    import { createStore } from 'vuex';
    
    export default createStore({
        state: {
            token: ''
        },
        getters: {},
        mutations: {
            set_token(state, token) {
                state.token = token;
                sessionStorage.token = token
            }
        },
        actions: {},
        modules: {}
    });
    
    // main.js
    import { createApp } from 'vue'
    import App from './App.vue'
    import Antd from 'ant-design-vue';
    import router from './router/index'
    import VueCookies from 'vue3-cookies'
    import store from './store.ts'
    
    // import 'ant-design-vue/dist/antd.css';
    import VueLazyload from 'vue-lazyload'
    import axios from "axios";
    
    // 添加请求拦截器
    axios.interceptors.request.use(function (config) {
        // 在发送请求前的操作
        // 判断是否存在token,如果存在将每个页面header添加token
        if (store.state.token) {
            console.log(store.state.token)
            // config.headers.common['Authorization'] = "Bearer " + store.state.token
            config.headers.Authorization = "Bearer " + store.state.token
    
        }
        return config
    }, function (error) {
        router.push('/')
        return Promise.reject(error)
    })
    // 添加响应拦截器
    axios.interceptors.response.use(function (response) {
        // 操作相应数据
        return response
    }, function (error) {
        // 响应错误后做什么(可自由发挥)
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    store.commit('del_token')
                    router.push('/')
            }
        }
        return Promise.reject(error)
    })
    
    
    const app = createApp(App);  // 创建App
    app.use(VueLazyload)
    app.use(router)
    app.use(store)
    app.use(VueCookies)
    app.use(Antd).mount('#app');
    
    // AdminIndex.vue
    <script setup>
    	const store = useStore();
    	const {proxy} = getCurrentInstance()
    	const loginAdmin = (data) => {
        console.log(data)
        if (data['status']==="success") {
            message.success('登录成功!');
            // 设置cookie
            store.commit("set_token", data['token']['plainTextToken']);
            // get_data()
            loginCheck.value = "true"
            // 'plainTextToken'
        }
        else {
            message.error('登录失败,请检查账号密码重试');
        }
    }
    </script>
    

参考地址:https://dev.to/romanpaprotsky/vue-js-tok...

译文地址:https://learnku.com/laravel/t/43077

标签:Laravel,use,vue,Sanctum,token,import,php,store
From: https://www.cnblogs.com/emmmmcccc/p/17742087.html

相关文章

  • 视频监控/安防监控EasyCVR平台如何调取登录接口获取token?
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • token+redis的简单使用方式
    以用户登录为例,讲解token+redis的使用方式,环境是vue和springboot。一、用户登录时序图二、前端代码分析1、前端使用vuestore保存token2、在每次发起请求时进行响应拦截,从vuestore取出token,放在每次请求的请求头上三、后端代码分析1、在控制层接收账号,密码,调用服务层代......
  • NodeJS分别实现token、cookie登录注册鉴权(KOA2)
    源码https://github.com/NaCl-131/node-study.git包npminstallkoanpminodemon-D#保存自动更新npmikoa-router#路由npmikoa-body#解析post的传参npmimysql2sequelize#mysql和一个ORM工具npmijsonwebtoken#JWTnpmidotenv#.env文件npmikoa-sess......
  • 有人说SaToken吃相难看,你怎么看。
    前言今天摸鱼逛知乎,偶然看到了一个回答,8月份的,是关于SaToken的,一时好奇就点了进去。好家伙,因为一个star的问题,提问的人抱怨了许多,我有些意外,就仔细看了下面的评论,想知道一部分人的看法。案发现场大体上,分为两派。一派是对于强制star尤为反感,乃至因爱生恨(打个问号)?......
  • Spring Security 基于 JWT Token 的接口安全控制
    现在的网站开发,基本上都是前后端分离,后端提供api接口并进行权限控制。使用SpringSecurity框架可以大大简化权限控制的代码实现。对于后端接口而言,为了能够实现多节点负载均衡部署,更好的方案是不再使用Session了,绝大多数情况下,通过提交JWTToken来进行身份认证。本篇博客......
  • 关于JWT Token 自动续期的解决方案
    前言在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个jwttoken。前端(如vue)在接收到jwttoken后会将token存储到LocalStorage中。后续每次请求都会将此token放在请求头中传递到后端服务,后端服务会有一个过滤器对token进行拦截校验,校验token是否过期,如果t......
  • Angular APP_INITIALIZER Injection Token 的使用方法介绍
    import{APP_INITIALIZER}from'@angular/core'这行代码在Angular中的作用是导入名为APP_INITIALIZER的常量,它来自Angular核心模块@angular/core。APP_INITIALIZER是一个重要的Angular特性,它用于执行一系列初始化操作,通常用于配置应用程序之前执行一些必要的任务。......
  • 什么是 JSON Web Token
    JSONWebToken(JWT),又称为JSON令牌,是一种用于在网络应用之间安全地传输信息的开放标准(RFC7519)。它采用了一种紧凑的、自包含的方式来表示信息,通常用于身份验证和授权。JWT的设计目标是确保信息的完整性和安全性,同时具备易于使用和传输的特点。JWT的结构JWT由三个部分组成,它们之......
  • Angular 应用开发中 Injection Token 的使用方法介绍
    Angular是一个流行的前端JavaScript框架,它提供了一种强大的方式来构建单页应用程序(SPA)。在Angular中,依赖注入(DependencyInjection,DI)是一项关键的功能,它允许我们有效地管理应用程序中的依赖关系。Angular的依赖注入系统使用InjectionToken来实现某些特殊的依赖注入需求。在本文中,......
  • kubepi加入集群,生成token
    防丢失https://www.cnblogs.com/Chinori/p/17506348.html kubectlcreatesakubepi-user--namespacekube-systemkubectlcreateclusterrolebindingkubepi-user--clusterrole=cluster-admin--serviceaccount=kube-system:kubepi-userkubectl-nkube-systemcreatetoke......