代码之家  ›  专栏  ›  技术社区  ›  Student of Science craig_h

如何使用分离的vue前端检索laravel CSRF令牌

  •  0
  • Student of Science craig_h  · 技术社区  · 4 年前

    如果Laravel后端和Vue前端彼此分离(在不同的目录和不同的子域中),是否有方法将Laravel csrf令牌传递给Vue??

    我正在构建一个应用程序,并希望将后端和前端分开,以便于组织和团队合作。所以,它会是这样的:

    • api.mydomainexample.com(Laravel后端)
    • mydomainexample.com(Vue前端供公众使用)

    这可能吗?我所想的可能是为前端项目运行nodejs服务器,并使nodejs服务器与laravel服务器通信。我不知道怎么做。

    我发现 similiar stackoverflow questions ,但他们的回答并不能解决我的问题。我找到的最好的东西是 this

    0 回复  |  直到 4 年前
        1
  •  9
  •   FullStackOfPancakes    4 年前

    使用 Sanctum

    拉维后端

    1. composer require laravel/sanctum


    1. 发布Sanctum配置和迁移文件

      php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"


    1. 运行您的迁移-Sanctum将添加一个表来存储API令牌

      php artisan migrate


    1. 将Sanctum的中间件添加到您的 应用程序编程接口 App/Http/Kernel.php

    use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
    
    'api' => [
        EnsureFrontendRequestsAreStateful::class,
        'throttle:60,1',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    
    1. 配置您的SPA将从哪些域发出请求。从文档中:

    您可以使用sanctum配置文件中的有状态配置选项配置这些域。此配置设置确定在向API发出请求时,哪些域将使用Laravel会话cookies维护“有状态”身份验证。

    config\sanctum.php

    /*
        |--------------------------------------------------------------------------
        | Stateful Domains
        |--------------------------------------------------------------------------
        |
        | Requests from the following domains / hosts will receive stateful API
        | authentication cookies. Typically, these should include your local
        | and production domains which access your API via a frontend SPA.
        |
        */
    
        'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,localhost:8000,127.0.0.1,127.0.0.1:8000,::1')),
    

    1. 配置您的 config/cors.php

    <?php
    
    return [
    
        /*
        |--------------------------------------------------------------------------
        | Cross-Origin Resource Sharing (CORS) Configuration
        |--------------------------------------------------------------------------
        |
        | Here you may configure your settings for cross-origin resource sharing
        | or "CORS". This determines what cross-origin operations may execute
        | in web browsers. You are free to adjust these settings as needed.
        |
        | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
        |
        */
    
        'paths' => ['api/*', 'sanctum/csrf-cookie', 'login', '*'],
    
        'allowed_methods' => ['*'],
    
        'allowed_origins' => ['*'],
    
        'allowed_origins_patterns' => [],
    
        'allowed_headers' => ['*'],
    
        'exposed_headers' => [],
    
        'max_age' => 0,
    
        'supports_credentials' => true,
    
    ];
    
    1. 配置您的 config/session.php

    /*
        |--------------------------------------------------------------------------
        | Session Cookie Domain
        |--------------------------------------------------------------------------
        |
        | Here you may change the domain of the cookie used to identify a session
        | in your application. This will determine which domains the cookie is
        | available to in your application. A sensible default has been set.
        |
        */
    
        'domain' => env('SESSION_DOMAIN', null),
    
    1. .env ,添加以下内容:

    // Change .your-site.local to whatever domain you are using
    // Please note the leading '.'
    
    SESSION_DOMAIN=.your-site.local 
    SANCTUM_STATEFUL_DOMAINS=your-site.local:8000
    CORS_ALLOWED_ORIGINS=http://app.your-site.local:8000
    

    1. 经营 php artisan config:clear

    VUE前端

    1. 在前端中,创建以下文件夹/文件结构 @/src/services/api.js

    api.js

    import axios from 'axios';
    
    const apiClient = axios.create({
        baseURL: process.env.VUE_APP_API_URL,
        withCredentials: true,
    });
    
    export default apiClient;
    

    在根目录中,放置一个 环境署署长 文件中包含以下内容:

    VUE_APP_API_URL= 'http://api.your-site.local'  
    
    1. 要进行身份验证,您的SPA应首先向 /sanctum/csrf-cookie . 这就决定了 XSRF-TOKEN 曲奇此令牌需要在后续请求时发送(axios将自动为您处理)。之后,您将立即发送 POST /login 路线
    在Vue前端登录组件上:
    import Vue from 'vue'
    import apiClient from '../services/api';
    
    export default {
      data() {
        return {
            email: null,
            password: null,
            loading: false,
        };
      },
      methods: {
    
        async login() {
          this.loading = true; // can use this to triggle a :disabled on login button
          this.errors = null;
    
            try {
              await apiClient.get('/sanctum/csrf-cookie'); 
              await apiClient.post('/login', {
                email: this.email,
                password: this.password
              });
    
              // Do something amazing
              
            } catch (error) {
              this.errors = error.response && error.response.data.errors;
            }
    
          this.loading = false;
        },
    
      },