服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - chatGPT deBug解决管理员登入服务器返回401问题

chatGPT deBug解决管理员登入服务器返回401问题

2023-05-07 17:31boombb 编程技术

这篇文章主要介绍了chatGPT deBug解决管理员登入,服务器返回401,没有拿到数据,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题复现:

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

?
1
2
3
4
5
6
if (signatureMessage) {
     await signMessageAsync({
       message: signatureMessage,
     });
     dispatch(changeHasLoggedToTrue());
   }

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

signIn函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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变量里

?
1
2
3
4
5
6
7
8
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种可能的原因

chatGPT deBug解决管理员登入服务器返回401问题

关键是第一条 问题定位到了没有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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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:

?
1
2
3
4
5
6
useEffect(() => {
  if (hasSiginin) {
    console.log("有發送請求");
    searchList();
  }
}, []);

最终代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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

以上就是chatGPT deBug解决管理员登入,服务器返回401,没有拿到数据的详细内容,更多关于chatGPT deBug解决管理员登入,服务器返回401,没有拿到数据的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7229528526402977829

延伸 · 阅读

精彩推荐
  • 编程技术未来考研想学习人工智能,本科期间是否需要学习一下Java

    未来考研想学习人工智能,本科期间是否需要学习一下Java

    首先,如果未来考研要主攻 人工智能 相关方向,熟练掌握一门 编程语言 是很有必要的,在本科期间学习一下 Java 也是不错的选择,虽然Python语言在人工智...

    今日头条1602020-11-10
  • 编程技术我们一起聊聊幂等设计

    我们一起聊聊幂等设计

    我们开发一个转账功能,假设我们调用下游接口超时了。一般情况下,超时可能是网络传输丢包的问题,也可能是请求时没送到,还有可能是请求到了,返...

    捡田螺的小男孩6122022-01-04
  • 编程技术几款开源的中文分词系统

    几款开源的中文分词系统

    中文分词是做好中文内容检索、文本分析的基础,主要应用于搜索引擎与数据挖掘领域。中文是以词为基本语素单位,而词与词之间并不像英语一样有空格...

    编程技术网2132020-07-23
  • 编程技术用好 Vue 中 v-for 循环的 7 种方法

    用好 Vue 中 v-for 循环的 7 种方法

    Vue 中的 v-for 循环允许你在模板代码中编写 for 循环,尤其是当我们做下面的操作时非常有用。...

    前端先锋10452021-06-08
  • 编程技术是的,这是2021年优秀的CSS框架

    是的,这是2021年优秀的CSS框架

    我经常看到初级前端或后端开发人员问:什么是最好的CSS框架?因此,在多年来学习和使用很多CSS技术之后,我想和你分享我认为今天最好的CSS UI框架。...

    今日头条8922021-03-26
  • 编程技术Flutter入门,写一个跨平台的Hello World

    Flutter入门,写一个跨平台的Hello World

    这是一个跨端的时代,各种跨端框架你方唱罢我登场,今天小编带领大家来入门Flutter,看它到底有没有传说中的那么好。磨刀不误砍柴工,先来安装Flutt...

    今日头条7362021-02-01
  • 编程技术如何为Jenkins设置自定义UI主题

    如何为Jenkins设置自定义UI主题

    如果您对旧的Jenkins UI,其字体和图标不满意,则可以使用带有自定义徽标的自定义CSS样式对Jenkins进行改头换面。自定义CSS样式会更加美观些。...

    DevOps云学堂13952021-01-21
  • 编程技术阿里P6+面试:介绍下观察者模式?

    阿里P6+面试:介绍下观察者模式?

    在设计模式中也有一种模式能有效的达到解偶、异步的特点,那就是观察者模式又称为发布订阅模式。今天阿丙就分享一下实际开发中比较常见的这种模式...

    三太子敖丙9482021-06-03