我将带jwt的Passport.js用于对我的应用程序中的用户进行身份验证。我正在使用有效负载对jwt令牌进行签名,其中该有效负载包含其他字段和头像字段,以便在我的应用程序中使用头像。 现在,我希望用户能够编辑其头像。我实现了此功能,并能很好地解决一个问题:即使mongodb中的头像字段已更新,更改也仅在我注销并重新登录后才在应用程序中显示。(在令牌重新签名之后)>
在前端,我正在使用react + redux。
考虑到有效载荷的一部分,我应该如何正确更新此化身字段?我应该使用其他方法吗?
下面的代码:
登录下面的登录
: User.findOne({ email: email }).then(user => {
if (!user) {
return res.status(404).json({
email: "Couldn't find an account."
});
} else {
bcrypt.compare(password, user.password).then(isMatch => {
if (isMatch) {
//User matched
//Create JWT Payload (can contain any user info)
const payload = {
id: user.id,
firstname: user.firstname,
lastname: user.lastname,
email: user.email,
avatar: user.avatar
};
//Sign token
//The sign method from jwt needs a payload(user info), secret and optional expiration date
//This token is needed so the user can access private routes or any other private logic
jwt.sign(
payload,
keys.secretOrKey,
{ expiresIn: "1d" },
(err, token) => {
res.json({
success: true,
token: "Bearer " + token
});
}
);
} else {
return res
.status(400)
.json({ password: "Eroare! Parola incorecta!" });
}
});
}
});
});
Redux动作:
// Login
export const loginUser = userData => dispatch => {
axios
.post("/api/users/login", userData)
.then(res => {
//Save to localStorage
const { token } = res.data;
//Set token to localStorage
localStorage.setItem("jwtToken", token);
// Set token to Auth Header
setAuthToken(token);
// Decode token
const decoded = jwt_decode(token);
// Set current user
dispatch(setCurrentUser(decoded));
})
.catch(err => {
dispatch({
type: GET_ERRORS,
payload: err.response.data
});
});
};
//Set logged in user
export const setCurrentUser = decoded => {
return {
type: SET_CURRENT_USER,
payload: decoded
};
};
减速器:
const initialState = {
isAuthenticated: false,
user: {},
loading: false
};
export default function(state = initialState, action) {
switch (action.type) {
case USER_LOADING:
return {
...state,
loading: true
};
case SET_CURRENT_USER:
return {
...state,
isAuthenticated: !isEmpty(action.payload),
user: action.payload
};
default:
return state;
}
}
答案 0 :(得分:1)
基本上,在JWT令牌的有效负载中,有一些对您的前端代码有用的信息,例如电子邮件,用户名,头像,...
但是因为JWT令牌只能被验证并且只能在服务器上发布(它只能在前端解码,因为前端不知道JWT机密),所以每当您需要JWT有效负载中的新信息时,都需要在服务器上发行新令牌。
根据您的情况,您需要在更新头像后发布新的JWT令牌,并在updateAvatar API的响应中发送回JWT令牌。
之后,您可以使用新的JWT令牌更新localStorage,并在前端使用新的头像。