在客户端应用中存储用户ID以获取API请求

时间:2017-05-13 20:26:34

标签: javascript reactjs express redux jwt

我有一个Node-Express REST API,我可以向用户控制器发出GET请求 - /users/:id - 其中:id是存储在数据库中的用户ID号。我还有一个React-Redux客户端应用程序,可以调用API。为了发出请求,客户端应用程序需要访问用户标识,但我目前还不确定在客户端存储用户标识的最佳方法。

对于其他上下文,我的API会在登录时向客户端发送一个JWT token来保存用户ID;客户端应用将令牌保存在localStorage中。当客户端发出请求时,API会在将响应发送回客户端之前验证解码后的令牌中的user-id是否与URL中包含的Id匹配。

我看到两个可能的解决方案:

  1. 解码客户端上的JWT令牌,并使用令牌中存储的用户ID进行API调用。我认为这是一个潜在的安全风险,因为我相信我需要将这个秘密存储在客户端应用程序上。此外,拥有令牌的任何人都可以访问用户的信息。
  2. API在身份验证时发送用户ID,客户端将其存储在localStorage中。 (我不认为将它存储在Redux存储中会起作用,因为用户可以刷新,清除用户ID的状态)。我的感觉是,这不是最佳实践,因为我没有看到许多其他客户端应用程序采用这种方法。
  3. 两者中哪一个是更好的解决方案,还是我没有考虑其他方法?

2 个答案:

答案 0 :(得分:1)

你对选项#1是正确的。 永远不要解码令牌客户端。这将要求客户端代码知道“秘密”,这会将其暴露给通过您的Javascript查找的任何人。

选项#2是好的,假设您仍然为每个安全目的请求发送令牌。对于存储,是的,你必须将它存储在cookie或localStorage中,或者你说它会在刷新时丢失。

要获取客户端代码中的ID,请让客户端代码从cookie / localstorage中读取它。有图书馆;例如,react-cookie读取cookie。您可以在每次需要访问它时执行此操作,也可以在初始页面加载期间读取一次,然后将其分派到Redux存储中。

答案 1 :(得分:0)

/users/:id端点,您可以查看是否提供了:id,如果没有,请从JWT令牌中提取ID,否则请使用id被传递给API调用。

如果这是不可接受的,那么您可以使用选项#2但使用sessionStorage代替localStorage