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

这篇具有很好参考价值的文章主要介绍了chatGPT deBug解决管理员登入,服务器返回401,没有拿到数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题复现:

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

   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种可能的原因

chatgpt unauthorized,踩坑系列,javascript,前端,开发语言

关键是第一条 问题定位到了没有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文章来源地址https://www.toymoban.com/news/detail-795417.html

到了这里,关于chatGPT deBug解决管理员登入,服务器返回401,没有拿到数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 银河麒麟高级服务器操作系统V10-系统管理员手册:04 安装和管理软件

    目录 第四章 安装和管理软件 4.1. 检查和升级软件包 4.1.1. 软件包升级检查 4.1.2. 升级软件包 4.1.3. 利用系统光盘与 dnf 离线升级系统 4.2. 管理软件包 4.2.1. 检索软件包 4.2.2. 安装包列表 4.2.3. 显示软件包信息 4.2.4. 安装软件包 4.2.5. 下载软件包 4.2.6. 删除软件包 4.3. 管理软件包组

    2024年02月03日
    浏览(42)
  • 银河麒麟高级服务器操作系统V10-系统管理员手册:05 基础服务

    目录 第五章 基础服务 5.1. 使用 systemd 管理系统服务 5.1.1. Systemd 介绍 5.1.1.1. 主要特性 5.1.1.2. 兼容性 5.1.2. 管理系统服务 5.1.2.1. 显示服务 5.1.2.2. 显示服务状态 5.1.2.3. 启动服务 5.1.2.4. 停止服务 5.1.2.5. 重启服务 5.1.2.6. 启用服务 5.1.2.7. 禁用服务 5.1.3. 管理目标 5.1.3.1. 查看默认目

    2024年02月06日
    浏览(48)
  • 银河麒麟高级服务器操作系统V10-系统管理员手册:01 基本系统配置

    目录 第一章 基本系统配置 1.1. 系统地区和键盘配置 1.1.1. 配置系统地区 1.1.1.1. 显示当前配置 1.1.1.2. 显示可用地区列表 1.1.1.3. 配置地区 1.1.2. 配置键盘布局 1.1.2.1. 显示当前配置 1.1.2.2. 显示可用键盘布局列表 1.1.2.3. 配置键盘 1.1.3. 其他资源 1.2. 网络访问配置 1.2.1. 动态网络配置

    2024年02月15日
    浏览(51)
  • 银河麒麟高级服务器操作系统V10-系统管理员手册:03 常用图形化工具

    目录 第三章 常用图形化工具 3.1. 刻录工具 3.2. 磁盘 3.2.1. 磁盘管理 3.2.1.1. 磁盘管理工具介绍 3.2.1.2. 磁盘管理工具界面展示 3.2.2. 磁盘管理工具使用 3.2.2.2. 分区格式化 3.2.2.3. 分区编辑 3.2.2.4. 编辑文件系统 3.2.2.5. 分区大小调整 3.2.2.6. 分区卸载和挂载 3.2.2.7. 分区删除 3.3. 远程

    2024年02月08日
    浏览(102)
  • Windows Update被管理员禁用怎么解决

    大家好,我是破解窝,相信大家的电脑都经历过这种情况 如下图: 想更新,但是提示说你的 *组织已关闭自动更新 ,但是又找不到开启的方法,这是怎么回事? 电脑开启自动更新会更新到更高版本,但是Microsoft怕一些用户不喜欢更新之后的版本,在Windows11中如果你没有开启

    2024年02月06日
    浏览(36)
  • 由于没有远程桌面授权服务器可以提供许可证,远程回话连接已断开,请跟服务器管理员联系。

    电脑启用远程桌面后,可以在发起远程控制的电脑上搜索“远程桌面连接”并将其打开。 在cmd终端中输入:   即可连接上远程。这里将127.0.0.1 换成你自己的远程IP即可。

    2024年02月03日
    浏览(35)
  • 由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。请跟服务器管理员联系

    1、“由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。请跟服务器管理员联系。” 2、按 win+R 键 打开运行,输入regedit 然后按 确定 3、然后进入 HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control Terminal Server RCM GracePeriod ,选中 GracePeriod 然后右键 点击 权限

    2024年02月13日
    浏览(36)
  • TDSQL赤兔管理台无管理员用户密码解决方案

    解决方案 tdsql使用过程中,可能会遇到控制台用户密码忘记的情况,用户登录次数过多被锁的情况,没有管理员的用户密码又急需某些权限的情况。 在浏览器上打开如下命令,其中IP换成你自己的赤兔控制台的IP http://192.168.101.101/tdsqlpcloud/index.php/api/install/get_db_info 获取配置库

    2024年02月11日
    浏览(44)
  • 关于Nextcloud连接Onlyoffice成功后提示“ONLYOFFICE服务器无法连接,请联系管理员。“错误的处理方法

    好不容易才把onlyoffice连接成功,你竟然还给我来这个错误,实在是不应该呀,都最后一公里了,可不能放弃,必须得把它给解决。 现在不妨从开始说起: 在Docker容器内部 ,宿主机相当于一个网关,宿主机根据不同的端口给每个容器分配一个独立的IP地址。这时所有Docker上所

    2023年04月09日
    浏览(64)
  • Win10解决:系统管理员已阻止你运行此应用

    前言 Win10安装msi软件包时出现错误提示如下: 解决 按【win+R】快捷键打开运行,输入 gpedit.msc 回车 依次进入”Windows设置“—”安全设置“—”本地策略“–”安全选项“—”用户账户控制:以管理员批准模式运行所有管理员“—双击,设置为”已禁用“,应用确定。 重启电

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包