我在app上使用Node JS,JWT和Sequelize进行身份验证,我正在使用React JS / redux作为前端部分。我已经成功实现了应用程序的登录/注销/注册部分,但现在我需要访问登录的current_user。
我在localStorage中放置了一个JWT,但我希望能够访问用户ID,用户电子邮件,用户名以及有关我当前登录用户的更多信息。
我应该使用Cookies吗? LocalStorage?或者我应该在我的API中创建currentUser方法?
如果有人可以帮我找到一些有用的资源或建议,我有点迷失方向!
谢谢!
答案 0 :(得分:3)
如果您将这些信息放在JWT的有效负载中,那么您无需在服务器上解码或需要密钥就可以获取它,因此可以将令牌放在LocalStorage中以供使用。根据规范,JWT是<headerINfo>.<payloadInfo>.<signature>
。所以在客户端,您可以这样做:
// given a payload object of { username: 'bob', userid: 1, email: 'bob@example.com' }
const tokenParts = token.split('.');
const encodedPayload = tokenParts[1];
const rawPayload = atob(encodedPayload);
const user = JSON.parse(rawPayload);
console.log(user.username); // outputs 'bob'
显然,任何有权访问令牌的客户都可以使用此信息,因此您只想将内容放入有效负载中即可。
答案 1 :(得分:1)
将令牌存储在LocalStorage中很好。如果您需要获取用户详细信息,请在API中创建端点,例如getUser
。然后,您可以使用jwt.decode(accessToken, JWT SECRET HERE)
并返回解码后的值(将是您的用户),假设accessToken有效。
答案 2 :(得分:0)
如果您还没有,您可以制作一个中间件,以确保用户信息始终可用于需要它的路由:
const auth = jwt({
secret: JWT_SECRET,
userProperty: 'payload',
algorithms: ['HS256']
});
module.exports = auth;
那么你应该有包含用户详细信息的 req.payload。或者,您可以根据您设置应用的方式检查标头中的 Authorization 属性。
答案 3 :(得分:0)
登录时,服务器应该发送令牌和用户数据,您可以将这些数据存储在 Redux 存储中。然后只需从那里请求数据。当用户重新加载页面时,使用 JWT 令牌发送 API 请求,服务器应返回用户数据,您将再次放入 Redux 存储。