【发布时间】:2021-05-06 03:46:27
【问题描述】:
我正在寻找一种干净的方式来将我的访问令牌存储在 React 中。
- 第一件事:我不想使用本地存储。我不需要使我的访问令牌持久化,因为我可以随时刷新它。
- 我还排除了一个 cookie,因为我想防止 CSRF 攻击。通过只将访问令牌存储在内存中,实际上需要加载页面才能获取令牌并验证请求(刷新令牌只能用于刷新)
- 我曾想过使用 redux/context,但是,调用 API 的函数不是组件的子组件,因此我无法从中访问令牌。此外,我不想将令牌作为参数传递,因为我想保持 HTTP 逻辑的解耦。也许有一种干净的方式来使用它?
经过一番研究,我发现使用全局变量是一种有效的“作弊”来获得我想要的东西。但是,我猜测是否有更清晰的方法可以获得相同的结果。
//token.js
const access_token= "";
export const setAccessToken(token){
access_token=token;
}
export const getAccessToken(){
return access_token;
}
//NOTICE:
// -ON LOGIN/REFRESH: I set the access token
// -ON API CALLS: I get the access token and I add it to the header
api.js
const baseURL= "http://my_base_url";
const generateApiInterface = ()=>{
let headers : any= {
};
token=getAccessToken(); //HERE I NEED TO RETRIEVE MY ACCESS TOKEN
if(token){
headers={
'Authorization': 'Token '+ token,
...headers //append other basic proprieties
}
}
return axios.create({
baseURL: baseURL,
headers: headers
});
}
const api = generateApiInterface();
【问题讨论】:
-
将其存储在 cookie 中并在每次您想要进行 HTTP 调用时从那里检索它有什么问题?
-
我已经在一个仅限 HTTP 的 cookie 中有刷新令牌。我不想将访问令牌放在 cookie 中以防止 CSRF 攻击
-
既然你提到了登录,你肯定有某种会话。我会将访问令牌存储在会话级别,即使您可以做到,也无需总是获取新的令牌。
-
实际上我正在使用 JWT 在客户端存储“会话”。为了避免安全问题,我需要刷新我的令牌。为了更好地理解我的方法,我将您链接到我解释我的身份验证过程的帖子(询问它是否是一个好方法):stackoverflow.com/questions/65946041/…
标签: javascript reactjs typescript