React Js 与 Laravel API Sanctum 用户注册 419 错误

问题描述 投票:0回答:1

我是 React js 新手,正在尝试使用 Laravel API Sanctum 通过我的 React JS 前端将新用户注册到我的数据库中,但出现此错误:

Request failed with status code 419
AxiosError: Request failed with status code 419
    at settle (http://localhost:3000/static/js/bundle.js:80917:12)
    at XMLHttpRequest.onloadend (http://localhost:3000/static/js/bundle.js:79599:66)

我的 UserAPIController.php laravel 文件

<?php

namespace App\Http\Controllers\API;

use App\Models\User;
use Validator;
use Illuminate\Support\Facades\Hash;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class ApiV1UserController extends Controller
{
    public function register(Request $request){
        $validator = Validator::make($request->all(),[
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'mobile' => ['required', 'string', 'min:10'],
            'password' => ['required', 'string', 'min:8']
            // 'password' => ['required', 'string', 'min:8', 'confirmed']
        ]);
        if($validator->fails()){
            return response()->json(['validation_errors'=>$validator->messages()],422);
        }else{
            $user = User::create([
                'name'=>$request->name,
                'email'=>$request->email,
                'mobile'=>$request->mobile,
                'password'=>Hash::make($request->password),
            ]);
            $token = $user->createToken($user->email.'_Token')->plainTextToken;

            return response()->json([
                "status"=>true,
                "username"=>$user->name,
                "token"=>$token,
                "message"=>"User Registered Succesfully!"
            ],201);
        }
    }
}

我的 Register.js 反应文件

import React, { useState, useRef } from "react";
import { useNavigate, BrowserRouter as Router } from "react-router-dom";
import { Routes, Route } from "react-router";
import { Link } from "react-router-dom";
import axios from "axios";
import swal from "sweetalert";
import { aslInterpreting, snowflakeO } from "fontawesome";

function Register() {
  const navigate = useNavigate();

  const [registerInput, setRegister] = useState({
    name: "",
    email: "",
    mobile: "",
    password: "",
    error_list: [],
  });

  const handleInput = (e) => {
    e.persist();
    setRegister({ ...registerInput, [e.target.name]: e.target.value });
  };

  const registerSubmit = (e) => {
    e.preventDefault();
    const data = {
      name: registerInput.name,
      email: registerInput.email,
      mobile: registerInput.mobile,
      password: registerInput.password,
    };

    axios.get("/sanctum/csrf-cookie").then((response) => {
      axios.post(`/api/register`, data).then((res) => {
        if (res.data.status === 201) {
          localStorage.setItem("auth_token", res.data.token);
          localStorage.setItem("auth_name", res.data.username);
          swal("Success", res.data.message, "success");
          navigate("/");
        } else {
          setRegister({
            ...registerInput,
            error_list: res.data.validation_errors,
          });
        }
      });
    });
  };

  return (
    <section className="login-box">
      <div className="container">
        <div className="row">
          <div className="col-lg-3"></div>
          <div className="col-lg-6">
            <div className="input-box">
              <header>Create Account</header>
              <form onSubmit={registerSubmit}>
                <div className="input-field">
                  <input
                    type="text"
                    className="input"
                    onChange={handleInput}
                    value={registerInput.name}
                    name="name"
                    id="name"
                  />
                  <label>Full Name</label>
                  <span className="text-danger">
                    {registerInput.error_list.name}
                  </span>
                </div>
                <div className="input-field">
                  <input
                    type="email"
                    className="input"
                    onChange={handleInput}
                    value={registerInput.email}
                    name="email"
                    id="email"
                  />
                  <label>Email</label>
                  <span className="text-danger">
                    {registerInput.error_list.email}
                  </span>
                </div>
                <div className="input-field">
                  <input
                    type="text"
                    className="input"
                    onChange={handleInput}
                    value={registerInput.mobile}
                    name="mobile"
                    id="mobile"
                  />
                  <label>Mobile</label>
                  <span className="text-danger">
                    {registerInput.error_list.mobile}
                  </span>
                </div>
                <div className="input-field">
                  <input
                    type="password"
                    className="input"
                    onChange={handleInput}
                    value={registerInput.password}
                    name="password"
                    id="password"
                  />
                  <label>Password</label>
                  <span className="text-danger">
                    {registerInput.error_list.password}
                  </span>
                </div>
                <div className="ps-2 pb-3">
                  <input type="checkbox" className="me-1" name="" id="" />
                  <Link to="/terms-conditions">
                    Agree to our terms and conditions
                  </Link>
                </div>
                <div className="input-field">
                  <button type="submit" className="login-submit">
                    Register
                  </button>
                </div>
              </form>
              <div className="signin">
                <div className="signup pb-2">
                  <span>
                    <Link to="/login">Already has an account?</Link>
                  </span>
                </div>
                <span className="pb-2">
                  <Link to="#">Forgot password?</Link>
                </span>
              </div>
            </div>
          </div>
          <div className="col-lg-3"></div>
        </div>
      </div>
    </section>
  );
}

export default Register;

还有我的 App.js 反应文件

import React from "react";
import { BrowserRouter as Router } from "react-router-dom";
import { Routes, Route } from "react-router";
import axios from "axios";

import "./App.css";

import Navbar from "./components/Navbar";
import Footer from "./components/Footer";
import Home from "./components/Home";
import Products from "./components/Products";
import Login from "./components/Login";
import Register from "./components/Register";
import Dashboard from "./components/Dashboard";

axios.defaults.baseURL = "http://jaano.test";
axios.defaults.headers.post["Content-Type"] = "application/json";
axios.defaults.headers.post["Accept"] = "application/json";

axios.defaults.withCredentials = true;

function App() {
  return (
    <div className="app">
      <Router>
        <Navbar />
        <Routes>
          <Route exact path="/" element={<Home />}></Route>
          <Route exact path="/products" element={<Products />}></Route>
          <Route exact path="/login" element={<Login />}></Route>
          <Route exact path="/register" element={<Register />}></Route>
          <Route exact path="/dashboard" element={<Dashboard />}></Route>
          <Route exact path="/profile" element={<Profile />}></Route>
        </Routes>
        <Footer />
      </Router>
    </div>
  );
}

export default App;

我在控制台中收到此错误

{消息:“CSRF 令牌不匹配。”,异常:“Symfony\Component\HttpKernel\Exception\HttpException”,…} 例外 : “Symfony\Component\HttpKernel\Exception\HttpException” 文件 : “D:\ xampp \ htdocs \ jaano \ jaanobackend endor \ laravel ramework \ src \ Illuminate \ Foundation \ Exceptions \ Handler.php” 线 : 第389章 信息 : “CSRF 令牌不匹配。”

Any help?

csrf token error in laravel sanctum API and react js
javascript php reactjs laravel laravel-sanctum
1个回答
0
投票

您需要在 axios 调用中传递 CSRF 标头。您可以使用拦截器来做到这一点。

axios.interceptors.request.use(
  (config) => {
    const newConfig = config;
    if (cookie.parse(document.cookie)["XSRF-TOKEN"]) {
      newConfig.headers!["X-XSRF-TOKEN"] = cookie.parse(document.cookie)[
        "XSRF-TOKEN"
      ];
    }

    return newConfig;
  },
  (err) => {
    return Promise.reject(err);
  }
);

完成此操作后,请仔细检查登录/注册请求是否使用 XSRF-TOKEN 标头。

© www.soinside.com 2019 - 2024. All rights reserved.