访问令牌过期后的未授权请求

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

axios.js

import axios from "axios";

let refresh = false;

axios.defaults.headers.common['Authorization'] = `Bearer ${localStorage.getItem('access_token')?localStorage.getItem('access_token'):null}`

axios.interceptors.response.use(resp => resp, async error => {
  if (error.response.status === 401 && !refresh) {
     refresh = true;
     const response = await
           axios.post('http://127.0.0.1:8000/token/refresh/', 
                      {refresh:localStorage.getItem('refresh_token')},
                      {headers: {'Content-Type': 'application/json'}},
                      {withCredentials: true}
                      );

      let access_token = response.data.access;
      axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}`;
      console.log(axios.defaults.headers.common['Authorization']);
      localStorage.setItem('access_token', response.data.access);
      localStorage.setItem('refresh_token', response.data.refresh);
      return axios(error.config);
  }
refresh = false;
return error;
});

登录.js

import axios from "axios";
import { useState } from "react";
// Define the Login function.
export const Login = () => {
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [invalid, setInvalid] = useState(false);
// Create the submit method.
const submit = async (e) => {

  e.preventDefault();
  const user = {
  username: username,
  password: password,
  };
  // Create the POST requuest
  try {
    const { data } = await axios.post("http://127.0.0.1:8000/token/", user,
    {headers: {'Content-Type': 'application/json'}},
                  {withCredentials: true});

    // Initialize the access & refresh token in localstorage.
    localStorage.clear();
    localStorage.setItem("access_token", data.access);
    localStorage.setItem("refresh_token", data.refresh);
    let access_token = localStorage.getItem('access_token');
    axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}`;
    window.location.href = "/";
  } catch (e) {
      setInvalid(true);
    }
};


  return (
    <div className="Auth-form-container">
      <form className="Auth-form" onSubmit={submit}>
        <div className="Auth-form-content">
          <h3 className="Auth-form-title">Sign In</h3>
          <div className="form-group mt-3">
            <label>Username</label>
            <input
              className="form-control mt-1"
              placeholder="Enter Username"
              name="username"
              type="text"
              value={username}
              required
              onChange={(e) => setUsername(e.target.value)}
            />
          </div>
          <div className="form-group mt-3">
            <label>Password</label>
            <input
              name="password"
              type="password"
              className="form-control mt-1"
              placeholder="Enter password"
              value={password}
              required
              onChange={(e) => setPassword(e.target.value)}
            />
          </div>
          <div className="d-grid gap-2 mt-3">
            <button type="submit" className="btn btn-primary">
            Submit
            </button>
          </div>
        </div>
      </form>
      {invalid && "Invalid Credentials!!!"}
    </div>
  );
};

Home.js

import {useEffect, useState} from "react";
import axios from "axios";
import jwt_decode from 'jwt-decode';
// Define the Login function.
export const Home = () => {
     const [message, setMessage] = useState('');
     const [user, setUser] = useState();

     useEffect(() => {
        if(localStorage.getItem('access_token') === null){                   
            window.location.href = '/login'
        }
        else{
         (async () => {
           try {
             let access_token = localStorage.getItem('access_token');
             let user_id = jwt_decode(access_token).user_id;
             const {data} = await axios.get(   
                            `http://127.0.0.1:8000/home/`,
                            {headers: 
                              {'Content-Type': 'application/json',
                              }}
                            );
             setMessage(data.message);
          } catch (e) {
          }
         })()};
     }, []);

     
     return (
        <div className="form-signin mt-5 text-center">
          <h3>Hi {message}</h3>
        </div>
     );
}

我已经在 index.js 中导入了拦截器。我遇到了一个问题,当访问令牌过期时,我在向 /token/refresh/ 发送发布请求时获得状态 401。在获得对 127.0.0.1:8000/home/ 的未授权访问后,当我再次刷新页面时,它就被授权了。

javascript reactjs web axios interceptor
© www.soinside.com 2019 - 2024. All rights reserved.