设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间04 现在时间04 缓存数据 十七岁吻的人额头没有粉底

十七岁吻的人额头没有粉底 -- 十七岁

查看: 2181|回复: 4

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:216
  • 打卡月天数:0
  • 打卡总奖励:3161
  • 最近打卡:2025-03-21 14:58:28
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
447
主题
405
精华
0
金钱
4477
积分
886
注册时间
2023-1-5
最后登录
2025-5-31

发表于 2023-5-7 12:02:50 | 显示全部楼层 |阅读模式
问题复现:

连接钱包后,会调用函数,弹出窗口让用户签名
  1.    if (signatureMessage) {
  2.         await signMessageAsync({
  3.           message: signatureMessage,
  4.         });
  5.         dispatch(changeHasLoggedToTrue());
  6.       }
复制代码
有了签名后,会调用signIn来设置本地存储

signIn函数
  1.   const signIn = async (signature) => {
  2.     try {
  3.       const signinRes = await API.post(`/auth/signin`, {
  4.         address: address,
  5.         signature: signature,
  6.       });
  7.       const accessToken = signinRes.data?.data?.access_token;
  8.       setLocalStorage("accessToken", accessToken);//设置本地存储
  9.       refreshAPIToken();
  10.       addressInfo.current.address = address;
  11.     } catch (err) {
  12.       console.log("signin");
  13.       showMessage({
  14.         type: "error",
  15.         title: "Failed to sign-in",
  16.         body: err.message,
  17.       });
  18.       disconnect();
  19.     }
  20.   };
复制代码
如果用户连接了钱包就会调接口,获取用户是否是管理员 通过RTK(redux toolkit)存储在isAdmin变量里
  1. const res = await API.get(`/member/${address}`);
  2.         if (!res.data.data) {
  3.           dispatch(changeIsAdminToFalse());
  4.           return;
  5.         }
  6.         if (res.data.data.role.includes("Member")) {
  7.           dispatch(changeIsMemberToTrue());
  8.         }
复制代码
当isAdmin为true的时候,才显示member列表
后端接口也限制了,不是管理员拿不到数据,而我明明用管理员登入了,还是拿不到,刷新才拿得到数据。不刷新的时候控制台报401,Unauthorized,没有权限。

解决过程

于是问了gpt
gpt给了5种可能的原因
130416x539g1r4p15h9e9p.png

关键是第一条 问题定位到了没有accessToken 但是我一看控制台Application里面 access token没错,是有的,但是数据要刷新页面才出来,于是我继续问
  1. 我: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
  2. 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.
  3. 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. import axios from 'axios';
  2. const API = axios.create({
  3.   baseURL: 'https://example.com/api',
  4.   headers: {
  5.     Authorization: `Bearer ${getLocalStorage('accessToken')}`,
  6.   },
  7. });
  8. API.interceptors.response.use(
  9.   response => response,
  10.   async error => {
  11.     const originalRequest = error.config;
  12.     if (error.response.status === 401 && !originalRequest._retry) {
  13.       originalRequest._retry = true;
  14.       const accessToken = await handleRefreshToken();
  15.       API.defaults.headers.common.Authorization = `Bearer ${accessToken}`;
  16.       return API(originalRequest);
  17.     }
  18.     return Promise.reject(error);
  19.   },
  20. );
复制代码
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之后新增
  1. dispatch(changeSigninToTrue());
复制代码
useEffect监听hasSiginin:
  1.   useEffect(() => {
  2.     if (hasSiginin) {
  3.       console.log("有發送請求");
  4.       searchList();
  5.     }
  6.   }, []);
复制代码
最终代码
  1. import axios from "axios";
  2. import { getLocalStorage, removeLocalStorage } from "@/src/utils/utility";
  3. import { useLogout } from "../src/hooks/useLogout";
  4. const API = axios.create({
  5.   baseURL: process.env.NEXT_PUBLIC_FRENART_BACKEND_API,
  6. });
  7. API.interceptors.request.use(
  8.   (config) => {
  9.     const accessToken = refreshAPIToken();
  10.     if (accessToken) {
  11.       config.headers.Authorization = `Bearer ${accessToken}`; //accessToken
  12.     }
  13.     return config;
  14.   },
  15.   (error) => Promise.reject(error)
  16. );
  17. function handleUnauthorizedError() {
  18.   const logout = useLogout();
  19.   logout();
  20. }
  21. API.interceptors.response.use(
  22.   (response) => response,
  23.   async (error) => {
  24.     const accessToken = refreshAPIToken();
  25.     error.config.headers.Authorization = `Bearer ${accessToken}`;
  26.     const originalRequest = error.config;
  27.     if (error.response?.status === 401 && !originalRequest._retry) {
  28.       console.log("401");
  29.       handleUnauthorizedError();
  30.     }
  31.     return Promise.reject(error);
  32.   }
  33. );
  34. function refreshAPIToken() {
  35.   const accessToken = getLocalStorage("accessToken");
  36.   API.defaults.headers.common.Authorization = `Bearer ${accessToken}`;
  37.   return accessToken;
  38. }
  39. export { refreshAPIToken };
  40. export default API;
复制代码
之后管理员连接钱包,就能拿到数据了,因为发送请求的时候 header里面有了Authorization,即有了accessToken
以上就是chatGPT deBug解决管理员登入,服务器返回401,没有拿到数据的详细内容,更多关于chatGPT deBug解决管理员登入,服务器返回401,没有拿到数据的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:24
  • 打卡月天数:0
  • 打卡总奖励:327
  • 最近打卡:2025-04-02 21:15:21
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
370
积分
50
注册时间
2023-1-1
最后登录
2025-4-2

发表于 2023-5-23 04:37:32 | 显示全部楼层
谢谢分享~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
22
积分
24
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2023-12-9 08:42:36 | 显示全部楼层
感谢大大分享~~~~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2024-10-22 10:35:04 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
20
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2025-4-20 13:21:17 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表