当前位置: 首页 > 知识库问答 >
问题:

在React JS中auth令牌收到之前如何防止fetch请求?

贺华容
2023-03-14

// to check for fetch err

function findErr(response) {
    try {
        if (response.status >= 200 && response.status <= 299) {
            return response.json();
        } else if (response.status === 401) {
            throw Error(response.statusText);
        } else if (!response.ok) {
            throw Error(response.statusText);
        } else {
            if (response.ok) {
                return response.data;
            }
        }
    } catch (error) {
        console.log("caught error: ", error);
    }
}



const token = JSON.parse(localStorage.getItem("token"));

// actual fetch request

export async function getData() {
    const url = `${URL}/data`;

    var obj = {
        method: "GET",
        headers: {
            Accept: "application/json",
            "Content-Type": "application/json",
            Authorization: "Bearer " + `${token}`,
        },
    };

    const data = await fetch(url, obj)
        .then((response) => findErr(response))
    
        .then((result) => {
            return result.data;
        });

    return data;
}


import React, { useState, useEffect } from "react";


function getInfo() {

const [info, setInfo] = useState()

const importGetDataFunc = async () => {
        const data = await getData();

        setInfo(data);
    };

useEffect(() => {
        importGetDataFunc();
    
    }, []);
    return (
        <div>
            
        </div>
    )
}

export default getInfo



useEffect(() => {

if(token){
        importGetDataFunc();
}
    }, []);

共有1个答案

钦德佑
2023-03-14

你已经接近了。您需要将token作为依赖项添加到useEffect。此外,还需要将令牌获取逻辑移到组件中。

像这样的事情应该会奏效:

import React, { useState, useEffect } from "react";


function getInfo() {

const [info, setInfo] = useState()
const token = JSON.parse(localStorage.getItem("token"));

const importGetDataFunc = async () => {
        const data = await getData();

        setInfo(data);
    };

useEffect(() => {
        if(token) {
           importGetDataFunc(token);
        }
    
    }, [token]);

    return (
        <div>
            
        </div>
    )
}

export default getInfo

您还可以修改ImportgetDataFunc以将令牌作为参数接收。

const importGetDataFunc = async (token) => {
        const data = await getData(token);

        setInfo(data);
    };
export async function getData(token) {
    const url = `${URL}/data`;

    var obj = {
        method: "GET",
        headers: {
            Accept: "application/json",
            "Content-Type": "application/json",
            Authorization: "Bearer " + `${token}`,
        },
    };

    const data = await fetch(url, obj)
        .then((response) => findErr(response))
    
        .then((result) => {
            return result.data;
        });

    return data;
}
 类似资料:
  • 我正在创建REST API(Symfony 4,FOS REST捆绑包),为了测试,我正在使用Postman应用程序。问题是,在登录请求时,我获得了JWT令牌,之后,在每个其他请求中,我都必须将其作为授权标头的一部分作为承载令牌传递回去。由于每次登录时该令牌都会发生变化,因此每次登录后(当令牌过期时),我都必须手动复制/粘贴令牌值。 这能以某种方式避免并自动完成吗?

  • 我读过关于CSRF和不可预测的同步令牌模式是如何用来防止它的。我不太明白它是如何工作的。 让我们以这个场景为例: 用户使用以下表单登录到站点: 服务器还将令牌存储在会话中。发送请求时,它将表单数据中的令牌与会话中的令牌进行比较。 当黑客可以编写JavaScript代码时,如何防止CSRF: 发送GET请求到站点 接收包含请求表单的html文本。 在html文本中搜索CSRF令牌。 使用该令牌发出恶

  • 问题内容: 我对MVC项目的以下详细信息有疑问。 当我尝试将jquery ajax请求与加载面板(例如旋转gif(甚至文本))一起使用时,从提琴手观察到我收到错误消息 所需的反伪造表单字段“ __RequestVerificationToken”不存在。 如果我 在POST动作方法上发表评论 并使用加载面板,它工作正常,我想知道为什么会收到此错误。 我什至使用了查询字符串 还是我出错了 防伪令牌无

  • 我正在使用以下技术开发我的第一个NuxtJs应用程序。 对于后端API Laravel 7.3(Passport) NUXTV2。15.2 渲染模式:通用(SSR/SSG) NuxtAxios v5。13.1 NuxtAuth v5 我的登录API响应如下: nuxt.config.js 我ogin.vue 当我设置,auth_代币local被设置为完整的json对象,而不是“access_tok

  • 我在 asp.net 5(RC1)中几乎实现了OAuth2。我的解决方案基于Mark Hughes在 ASP.NET 5(vNext)中基于令牌的身份验证中给出的代码,这非常出色。 我的问题是我的设置使用CORS请求,几乎每个请求之前都有一个OPTIONS请求。即使我只将Authorize属性应用于GetAll控制器操作/方法,如下所示,前面的OPTIONS请求也被授权了。 授权服务设置正在启动。

  • 问题内容: 我想为基于Struts 1.x框架的Web应用程序实施跨站点请求伪造预防。我知道struts 2框架为此提供了令牌拦截器,并且可以使用过滤器实现类似的功能。 我对一些想法感到困惑1)如何以简单的方式生成唯一令牌?(我可以为此目的使用Action类令牌来避免重复提交表单) 将struts 1.x框架令牌机制用于CSRF预防是否存在任何问题 问题答案: Struts 1 Action令牌方