Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用fetch在前端存储和处理JWT令牌,以及如何存储它?_Javascript_Node.js_Api_Authentication_Jwt - Fatal编程技术网

Javascript 如何使用fetch在前端存储和处理JWT令牌,以及如何存储它?

Javascript 如何使用fetch在前端存储和处理JWT令牌,以及如何存储它?,javascript,node.js,api,authentication,jwt,Javascript,Node.js,Api,Authentication,Jwt,我是开发新手,我有一个任务管理器应用程序,我在其中使用JWT令牌进行验证,我可以让它在Postman上工作,但我不知道如何通过浏览器存储它并将其发送到服务器 下面是我试图使其工作的步骤,但它在事件侦听器外部表示未定义,并且我无法存储令牌以稍后将其发送到另一个url,我正在将令牌发送到API 以下是我的前端app.js代码,对于登录页面,登录时向用户发送JWT令牌: let inMemoryToken; const signInForm = document.querySelector( &q

我是开发新手,我有一个任务管理器应用程序,我在其中使用JWT令牌进行验证,我可以让它在Postman上工作,但我不知道如何通过浏览器存储它并将其发送到服务器

下面是我试图使其工作的步骤,但它在事件侦听器外部表示未定义,并且我无法存储令牌以稍后将其发送到另一个url,我正在将令牌发送到API

以下是我的前端app.js代码,对于登录页面,登录时向用户发送JWT令牌:

let inMemoryToken;


const signInForm = document.querySelector( "#sign-in-form" );
signInForm.addEventListener( "submit", ( e ) => {
    const email = document.querySelector( "#login-email" ).value;
    const password = document.querySelector( "#login-pass" ).value;
    e.preventDefault();
    console.log( email, password );
    fetch( "http://localhost:3000/users/login", {
        method: 'post',
        headers: {
            'Accept': 'application/json, text/plain, */*',
            'Content-Type': 'application/json'
        },
        body: JSON.stringify( {

            "email": email,
            "password": password,

        } )
    } ).then( res => res.json() )
        .then( res => {
            console.log( res );
            let inMemoryToken = res.token;
            console.log( inMemoryToken );
            // { Authorization: `Bearer  ${ inMemoryToken }`; }
            return inMemoryToken;
        } );

    console.log( inMemoryToken );

    
 return inMemoryToken;
} );
// inMemoryToken = res.body.token[ 0 ];
// let inMemoryToken2 = inMemoryToken;

console.log( inMemoryToken );
我登录的后端代码是:

router.post( "/users/login", async ( req, res ) => {
    try {
        const user = await User.findByCredentials(
            req.body.email,
            req.body.password
        );
        const token = await user.generateAuthToken();
        res.send( {
            user,
            token,
        } );
    } catch ( e ) {
        res.status( 400 ).send( {
            error: "Catch error",
            e,
        } );
    }
} );
另外,在获得此令牌后,我希望将其传递到我的任务url,如下所示:

const TaskForm = document.querySelector( "#add-tasks" );
TaskForm.addEventListener( "submit", ( e ) => {
    const task = document.querySelector( '#task' ).value;
    e.preventDefault();
    console.log( task );
    console.log( inMemoryToken );

    fetch( "http://localhost:3000/tasks/", {
        method: 'get',
        headers: {
            'Accept': 'application/json, text/plain, */*',
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ${inMemoryToken}'
        },
        body: JSON.stringify( {

            "Task": task

        } )
    } ).then( res => res.json() )
        .then( res => console.log( res ) );
} );


我三天来一直在尝试解决这个问题,但无法使其正常工作,非常感谢您的帮助。

要在客户端存储JWT,您有两种选择:
Cookies
LocalStorage
策略。我想你已经知道什么是饼干了。LocalStorage与cookie非常相似,但增强了,并且没有在头中发送信息(请参阅),这就是为什么LocalStorage通常作为持久对象应用的原因

服务器端保持原有状态。不需要改变

在客户端上,在登录响应的处理程序中,您将在本地存储中存储来自后端的响应,如下所示:

signinfo.addEventListener(“提交”,(e)=>{
. . .
取回(“http://localhost:3000/users/login", {
. . .
})。然后(res=>res.json()
。然后(res=>{
控制台日志(res);
让inMemoryToken=res.token;
setItem('user',JSON.stringify(res));
//“user”是本地存储中sotre的通用密钥。您可以使用任何名称
//存储完整的对象,以便以后可以访问“用户”和“令牌”
在任务函数中,您应该读取对象的本地存储

const TaskForm=document.querySelector(“添加任务”);
TaskForm.addEventListener(“提交”,(e)=>{
const task=document.querySelector(“#task”).value;
e、 预防默认值();
console.log(任务);
//----这是你必须补充的--------
const localstorage_user=JSON.parse(localstorage.getItem('user'))
const inMemoryToken=localstorage\u user.token
// -------------------------------------------
控制台日志(inMemoryToken);

非常感谢您,我真的很难弄明白这一点。非常感谢。另外,您能告诉我为什么我的授权传递在此代码中不起作用:如果您觉得它有用,请接受答案:-)您还有什么问题?您的评论中没有提供代码?您指的是您问题的代码吗?对不起,您的链接没有显示。我会看一看。对不起,我现在已经在JSFIDLE上添加了代码,请您看一看。嗯。我想是
字符。请尝试:
承载者${inMemoryToken}