【问题标题】:How do I fix the "401 Unauthorized" error with Laravel 8 Sanctum and VueJS 3?如何修复 Laravel 8 Sanctum 和 VueJS 3 的“401 Unauthorized”错误?
【发布时间】:2021-09-09 11:41:20
【问题描述】:

所以我在前端有这个Laravel 8 项目VueJS 3,我在我的本地主机上运行它
我正在使用Sanctum 进行身份验证。
登录和注册过程运行良好,但是当我转到仪表板并尝试向我的数据库添加一些内容时,它给了我401 Unauthorized 错误。

Laravel:

编辑: 用户控制器

public function login(Request $request)
    {
        $credentials = [
            'email' => $request->email,
            'password' => $request->password,
        ];

        if (Auth::attempt($credentials)) {
            $success = true;
            $user = User::where('email', $credentials['email'])->first();
            $token = $user->createToken("authToken")->plainTextToken;
        } else {
            $success = false;
        }

        $response = [
            'success' => $success,
            'access_token' => $token,
        ];
        return response()->json($response);
    }

web.php

Route::get('/{any}', function () {
    return view('welcome');
})->where('any', '.*');

api.php

// Auth
Route::post('login', [UserController::class, 'login']);
Route::post('register', [UserController::class, 'register']);
Route::post('logout', [UserController::class, 'logout'])->middleware('auth:sanctum');

// Niveau
Route::group(['prefix' => 'niveaux', 'middleware' => 'auth:sanctum'], function () {
    Route::get('/', [NiveauScolaireController::class, 'index']);
    Route::post('add', [NiveauScolaireController::class, 'add']);
    Route::get('edit/{id}', [NiveauScolaireController::class, 'edit']);
    Route::post('update/{id}', [NiveauScolaireController::class, 'update']);
    Route::delete('delete/{id}', [NiveauScolaireController::class, 'delete']);
});  

cors.php

'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true,

sanctum.php

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
    'SANCTUM_STATEFUL_DOMAINS',
    'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
    env('APP_URL') ? ',' . parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),  

session.php

'domain' => env('SESSION_DOMAIN', null),

这就是我为 Laravel 方面所做的设置。

VueJS

app.js

import { createApp } from "vue";
import App from "./App.vue";
import router from "./Router/index";
import axios from "axios";
const app = createApp(App);
app.config.globalProperties.$axios = axios;
app.use(router);
app.mount("#app");

bootsrap.js

window.axios = require("axios");
window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
windoow.axios.defaults.withCredentials = true;

登录组件

this.$axios.get("/sanctum/csrf-cookie").then((res) => {
    this.$axios
        .post("api/login", {
              email: this.email,
              password: this.password,
        })
        .then((res) => {
            if (res.data.success) {
                this.$router.push({ name: "Dashboard" });
            } else {
                console.log("Error: " + res.data.message);
            }
        })
        .catch(function (error) {
            console.log("error :>> ", error);
        });
    });

我对@9​​87654334@ 的请求进展顺利,我将收到 Cookie,登录正常,它从数据库中获取用户,然后将我重定向到仪表板。

问题
现在,当我尝试向(api/niveaux/add) 发送请求时,请求已发送,但我收到401 Unauthorized 错误,并带有{"message":"Unauthenticated."} 响应。

仪表板组件

this.$axios
    .post("api/niveaux/add", {
        nom: this.niveau,
    })
    .then((res) => {
        if (res.data.success) {
            alert(res.data.message);
        } else {
            alert(res.data.message);
        }
    })
    .catch(function (error) {
        console.log("error :>> ", error);
    });

【问题讨论】:

  • 感谢您的提问。我有同样的问题

标签: laravel vue.js axios laravel-sanctum


【解决方案1】:

您需要在 laravel 中包含 middleware('auth:sanctum') 的每个请求中向您发送 access_token。 您可以在登录后获得的 cookie 中找到 access_token。(可能有不同的名称,例如 token

axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}` 

axios.defaults.headers.common['Authorization'] = `${access_token}` 

必须做的伎俩

【讨论】:

  • 我已经尝试过了,但它不起作用,我编辑了我的问题并添加了 UserController,在我的 boostarp.js 文件中我做了你告诉我要做的更改,但仍然没有运气
【解决方案2】:

我认为您正在通过 localhost 端口 8000 访问,但是在您的 sanctum 配置下的有状态参数中,没有 localhost:8000。配置使用 $_SERVER['SERVER_NAME'] 因此它实际上在访问它时会查找确切的内容。

sanctum.php

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
    'SANCTUM_STATEFUL_DOMAINS',
    'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
    'localhost:8000',
    env('APP_URL') ? ',' . parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))), 

【讨论】:

  • 我试过了,还是一样的“401”错误,你有没有其他可能导致这个问题的想法
【解决方案3】:

注意到这里有一个错字:


window.axios = require("axios");
window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
windoow.axios.defaults.withCredentials = true;

最后一个“窗口”拼写错误。

【讨论】:

    【解决方案4】:

    当我遇到这种情况时,我跟踪并比较了对现有工作项目的更改

    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
        'SANCTUM_STATEFUL_DOMAINS',
        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
        env('APP_URL') ? ',' . parse_url(env('APP_URL'), PHP_URL_HOST) : ''
    ))), 
    

    config/sanctum.php 中已更改,我只是将其替换为旧代码

    'stateful' => explode(',', env(
        'SANCTUM_STATEFUL_DOMAINS',
        'localhost,127.0.0.1,127.0.0.1:8000,::1,' . parse_url(env('APP_URL'), PHP_URL_HOST)
    )),
    

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 2021-09-02
      • 2020-10-02
      • 2021-08-31
      • 1970-01-01
      • 2018-05-18
      • 2020-07-28
      • 2020-05-11
      • 2022-01-08
      相关资源
      最近更新 更多