JWT Nodejs-使用Decode访问另一个文件中的有效负载数据 [英] JWT Nodejs-Accessing payload data in another file using Decode

查看:41
本文介绍了JWT Nodejs-使用Decode访问另一个文件中的有效负载数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个controllerfile,在其中使用passport.authenticate.我声明我的有效负载并签名我的令牌,现在我需要在有效负载中声明的信息在另一个文件中,以便可以在我的sql请求中使用它们.这是登录auth的代码:

I have a controllerfile where I use passport.authenticate. I declare my payload and sign my token now i need the info declared in the payload in another file so I could use them in my sql request. Here's the code for the login auth :

login: (req, res, next) => {
console.log(" login");
passport.authenticate("local", { session: false }, (error, user) => {
    console.log("executing callback auth * from authenticate for local strategy ");

    //if there was an error in the verify callback related to the user data query 
    if (error || !user) {
        next(new error_types.Error404("Email ou Mot de passe invalide !"))
    }else {
        console.log("*** Token generation begins ***** ");
        console.log(user)
        const payload = {
            sub: user.id,
            exp: Date.now() + parseInt(process.env.JWT_LIFETIME),
            email: user.email,
            name: user.prenom,
            lastName: user.nom,
            type:user.type,
        };

        
        const token = jwt.sign(JSON.stringify(payload), process.env.JWT_SECRET, {algorithm: process.env.JWT_ALGORITHM});
        res.json({ token: token,type: user.type,userid:user.id  });//added userid
    }

})(req, res);
 }

现在在我的其他文件中,我需要获取user.id和user.type以便可以在请求中使用它们:

Now in my other file i need to get the user.id and user.type so that i could use them in my request :

const createProp=(req, res, next) => {
 let con=req.con

let { xx,yy } = req.body;
con.query('INSERT INTO tab1 
(xx,yy,user_id,user_type ) VALUES ($1, $2, $3, $4) ',[xx,yy,user_id,user_type],
(err, results) => {
  if (err) {
   console.log(err);
   res.status(404).json({error: err});
 }
 else
 {res.status(200).send(`success`)}
  }
 );

 }

在我的前端VUEJS中,这是我的文件:

in my frontend VUEJS this is my file:

   import router from '@/router'
   import { notification } from 'ant-design-vue'
    import JwtDecode from "jwt-decode";
   import apiClient from '@/services/axios'
   import * as jwt from '@/services/jwt'
 const handleFinish = (values) => {
  const formData = new FormData()
  for (var key of Object.keys(formState)) {
    formData.append(key, formState[key])//here im appending some fields in my         
          //form i have more than just xx,yy files i just put them as an 
          //example
  }
  const token = localStorage.getItem("accessToken"); 
        var decoded = JwtDecode(token);
        console.log(decoded)
  formData.append('user_id',decoded.sub)
  formData.append('user_type',decoded.type)     
  fileListFaisabilite.value.forEach((file) => {
    formData.append('xx', file)
  })
  fileListEvaluation.value.forEach((file) => {
    formData.append('yy', file)
  })
  
 // store.dispatch('user/PROPOSITION', formData)
}
 methods:{
 PROPOSITION({ commit, dispatch, rootState  }, formData ) {
  commit('SET_STATE', {
    loading: true,
  })
const proposition= 
 mapAuthProviders[rootState.settings.authProvider].proposition

  proposition(formData)
    .then(success => {
      if (success) {
        
        notification.success({
          message: "Succesful ",
          description: " form submited!",
        })
        router.push('/Accueil')
        commit('SET_STATE', {
          loading: false,
        })
      }
      if (!success) {
        commit('SET_STATE', {
          loading: false,
        })
      }
    })
 return  apiClient 
.post('/proposition', formData, {
  headers: {
    'Content-Type': 'multipart/form-data',
     },
      })
  .then(response => {
     if (response) {
      
    return response.data
  }
  return false
})
.catch(err => console.log(err)) 
},


 
},

我要寻找的是如何使用insertinto sql请求将用户ID和用户类型存储在数据库中.

What im looking for is how i can store in my database the userid and usertype using insertinto sql request.

推荐答案

您可以在您的jwt sign函数中设置用户数据,而无需使用stringify方法:

You can set user data in your jwt sign function without stringify method:

const payload = {
  sub: user.id,
  exp: Date.now() + parseInt(process.env.JWT_LIFETIME),
  email: user.email,
  name: user.prenom,
  lastName: user.nom,
  type: user.type // <-- Add this
};

        
const token = jwt.sign(
  payload, // Don't use JSON.stringify
  process.env.JWT_SECRET, 
  {algorithm: process.env.JWT_ALGORITHM}
);

并访问用户信息:

jwt.verify(token, process.env.JWT_SECRET, (err, payload) => {
    if (err) {
      // Handle error
    }

    // Get some data
    let user_id = payload.sub;
    let user_type = payload.type;
    console.log(user_id, user_type);

    next();
});

vue文件:

PROP({ commit, dispatch, rootState  }, payload ) {
  
  commit('SET_STATE', {
    loading: true,
  });
  const prop = mapAuthProviders[rootState.settings.authProvider].prop

  prop(payload)
    .then(success => {
      if (success) {
        // success contains user information and token:
        const { token, userid, type } = success;
        
        // Save to localStorage (Optional)
        localStorage.setItem("accessToken", token);
        localStorage.setItem("userid", userid);
        localStorage.setItem("type", type);

        // This not works if don't have a JWT SEED
        // var decoded = JwtDecode(token);

        commit('SET_STATE', {
          user_id: userid,
          user_type: type,
        })
        //dispatch('LOAD_CURRENT_ACCOUNT')
        notification.success({
          message: "Succesful ",
          description: " form submited!",
        })

        router.push('/Home')
        commit('SET_STATE', {
          loading: false,
        })
      }
      if (!success) {
        commit('SET_STATE', {
          loading: false,
        })
      }
    })
},

api调用文件:

export async function prop(payload) {
 try {
    const response = await apiClient.post('/prop', payload, {
        headers: { 'Content-Type': 'multipart/form-data'},
    });

    if (response) {
        return response.data;
    }

 } catch (err) {
    console.log(err);
 }

 return false; 
}

这篇关于JWT Nodejs-使用Decode访问另一个文件中的有效负载数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆