当前位置:首页 » 《随便一记》 » 正文

chatGPT deBug解决管理员登入,服务器返回401,没有拿到数据

9 人参与  2024年02月11日 17:36  分类 : 《随便一记》  评论

点击全文阅读


问题复现:

连接钱包后,会调用函数,弹出窗口让用户签名

   if (signatureMessage) {        await signMessageAsync({          message: signatureMessage,        });        dispatch(changeHasLoggedToTrue());      }

有了签名后,会调用signIn来设置本地存储

signIn函数

  const signIn = async (signature) => {    try {      const signinRes = await API.post(`/auth/signin`, {        address: address,        signature: signature,      });      const accessToken = signinRes.data?.data?.access_token;      setLocalStorage("accessToken", accessToken);//设置本地存储      refreshAPIToken();      addressInfo.current.address = address;    } catch (err) {      console.log("signin");      showMessage({        type: "error",        title: "Failed to sign-in",        body: err.message,      });      disconnect();    }  };

如果用户连接了钱包就会调接口,获取用户是否是管理员 通过RTK(redux toolkit)存储在isAdmin变量里

 const res = await API.get(`/member/${address}`);        if (!res.data.data) {          dispatch(changeIsAdminToFalse());          return;        }        if (res.data.data.role.includes("Member")) {          dispatch(changeIsMemberToTrue());        }

当isAdmin为true的时候,才显示member列表

后端接口也限制了,不是管理员拿不到数据,而我明明用管理员登入了,还是拿不到,刷新才拿得到数据。不刷新的时候控制台报401,Unauthorized,没有权限。

解决过程

于是问了gpt

gpt给了5种可能的原因

在这里插入图片描述

关键是第一条 问题定位到了没有accessToken 但是我一看控制台Application里面 access token没错,是有的,但是数据要刷新页面才出来,于是我继续问

我:the access token is right , we can get the requested source by this token after refresh. But how to get the requested source without refresh

GPT:If you’re able to access the resource after refreshing the page, it’s possible that the access token is not being sent with subsequent requests after the initial connection is made.

To ensure that the access token is being sent with all subsequent requests, you can set the token in the headers of the Axios instance. Here’s an example of how to do this:
翻譯:刷新后才出现数据,可能是因为在发送请求的时候access token没有被发送,为了确保所有的请求都带有access token 需要给axios实例设置header

import axios from 'axios';const API = axios.create({  baseURL: 'https://example.com/api',  headers: {    Authorization: `Bearer ${getLocalStorage('accessToken')}`,  },});API.interceptors.response.use(  response => response,  async error => {    const originalRequest = error.config;    if (error.response.status === 401 && !originalRequest._retry) {      originalRequest._retry = true;      const accessToken = await handleRefreshToken();      API.defaults.headers.common.Authorization = `Bearer ${accessToken}`;      return API(originalRequest);    }    return Promise.reject(error);  },);

GPT给了一段代码 我自己再看逻辑 修改 关键就是当服务器返回401的时候,要给axios请求设置accessToken,再次发送请求;

但是这种有漏洞,

1.每次请求刚开始都返回401,request拦截之后,再次发送请求才拿到数据

2.如果accessToken过期了,请求不到数据,需求是要清除本地缓存并退出钱包登录

第2条是新增的需求,如何判断accessToken过期,GPT说如果accessToken过期,服务器会返回401,所以这里if判断服务器会返回401后的逻辑不能是重新发送请求。首先要解决第一个问题。为何每次请求都返回401?

打log,发现在连接钱包set token,token有值之前,就发送请求,所以要在连接钱包set token,确保token有值之后才发送请求,之前是判断为管理员就发送请求,这个在需求层面来将没错,但是connect wallet 设置isAdmin为true的时候还没有set token 所以在 set token之后新增 dispatch(changeSigninToTrue()); useEffect监听hasSiginin:

  useEffect(() => {    if (hasSiginin) {      console.log("有發送請求");      searchList();    }  }, []);

最终代码:

import axios from "axios";import { getLocalStorage, removeLocalStorage } from "@/src/utils/utility";import { useLogout } from "../src/hooks/useLogout";const API = axios.create({  baseURL: process.env.NEXT_PUBLIC_FRENART_BACKEND_API,});API.interceptors.request.use(  (config) => {    const accessToken = refreshAPIToken();    if (accessToken) {      config.headers.Authorization = `Bearer ${accessToken}`; //accessToken    }    return config;  },  (error) => Promise.reject(error));function handleUnauthorizedError() {  const logout = useLogout();  logout();}API.interceptors.response.use(  (response) => response,  async (error) => {    const accessToken = refreshAPIToken();    error.config.headers.Authorization = `Bearer ${accessToken}`;    const originalRequest = error.config;    if (error.response?.status === 401 && !originalRequest._retry) {      console.log("401");      handleUnauthorizedError();    }    return Promise.reject(error);  });function refreshAPIToken() {  const accessToken = getLocalStorage("accessToken");  API.defaults.headers.common.Authorization = `Bearer ${accessToken}`;  return accessToken;}export { refreshAPIToken };export default API;

之后管理员连接钱包,就能拿到数据了,因为发送请求的时候 header里面有了Authorization,即有了accessToken


点击全文阅读


本文链接:http://zhangshiyu.com/post/68183.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 影帝求我别离婚,我转身去了对家列表_影帝求我别离婚,我转身去了对家(季淮顾言陆景行)
  • 点天灯后,偷我勋章的男友疯了(沈娇娇陆沉)_点天灯后,偷我勋章的男友疯了
  • 重生后,我让妻子后悔(云璟陆沈清)
  • 为了给我妈鸣冤,我在我爸六十大寿上毒翻全场(苏恒苏洛),为了给我妈鸣冤,我在我爸六十大寿上毒翻全场
  • 完结文老婆把女儿送给师弟练手后,后悔疯了列表_完结文老婆把女儿送给师弟练手后,后悔疯了(沈安姜向玉)
  • 白月光守寡后,夫君要纳她为妾留青赵恒完本_白月光守寡后,夫君要纳她为妾(留青赵恒)
  • 全书浏览妻子叫我转八十万给实习生(顾祁秦冉)_妻子叫我转八十万给实习生(顾祁秦冉)全书结局
  • 全文男友拿我的生活费给我开亲密付(夏染陈政)列表_全文男友拿我的生活费给我开亲密付
  • 大数据助力,我把妈妈告上法庭欣欣妈妈完本_大数据助力,我把妈妈告上法庭(欣欣妈妈)
  • 年薪百万后,我主动要求给穷光蛋生儿子(李明李小花)全书浏览_年薪百万后,我主动要求给穷光蛋生儿子全书浏览
  • 全书浏览年薪百万后,我主动要求给穷光蛋生儿子(李明李小花)_年薪百万后,我主动要求给穷光蛋生儿子(李明李小花)全书结局
  • 此生明月不照君全书萧景珩陆云峥林婉柔在线

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1