reactjs - 如何在reactjs中使用刷新 token

标签 reactjs authentication react-redux refresh-token

我正在 reactjs 中开发一个管理应用程序,它使用 redux 进行状态管理。在我的应用程序中,当用户登录时它得到 access_tokenrefresh _token . access_token 5 分钟后过期。 5 分钟后 token 变为无效,无法发出任何 api 端点请求。

我想知道我应该如何使用这个 refresh_token更新我的 access_token存储在 localStorage浏览器的。我不知道这个 refresh_token在这之前。这就是我如何提出登录请求并保存我的 access_tokenrefresh_token .

authentication


export  const Authentication = async(payload) =>{
    try{
    const response = await fetch(`${generalConfig.baseURL}/oauth/token`, {
        method: 'POST',
        cache: 'no-cache',
        headers: {
            'Authorization': `Basic ${btoa("topseller:topseller")}`,
            'Accept': '*/*',
            // 'Content-Type': 'multipart/form-data',
            'accept-encoding': 'gzip, deflate',

        },
        body: payload
    })
    .then((response)=>{
        console.log(response)
        return response.json()
    },err=>{
       console.log(err,'############')
    })
    console.log(response,'@@@@@@@@@')
    return response;
}catch(err){
    console.log(err,'############')
}
}

authentication.action


export const getAccessToken = (dataToSend) => async (dispatch) => {
  try {
    var formData = ConvertToFormData(dataToSend);
    const authResponse = await Authentication(formData);   <-- See above about this Authentication function

    const response = await fetch("http://api.smartocart.com/userType", {
      method: "GET",
      cache: "no-cache",
      headers: {
        Authorization: `Bearer ${authResponse.access_token}`,
      },
    });
    const payload = await response.json();

    if (payload.status === "admin") {
      SaveToLocalStorage("access_token", authResponse.access_token);
      SaveToLocalStorage("refresh_token", authResponse.refresh_token);
      dispatch({
        type: GET_ACCESS_TOKEN,
        payload: {
          access_token: authResponse.access_token,
          refresh_token: authResponse.refresh_token,
        },
      });
    } else {
      dispatch({
        type: ERROR_ACCESS_TOKEN,
        buttonPressed: true,
      });
    }
  } catch (exception) {
    console.log("Log In again");
  }
};

我确实在一些博客文章中读到过这个,但我确实得到了这个。 https://nmajor.com/posts/access-and-refresh-token-handling-with-redux
任何帮助将不胜感激。

最佳答案

您可以在 app.js 上添加 token 到期时间验证,因此如果您重新加载应用程序或移动到下一页,或者如果您进行 api 调用,它将始终检查 token 到期时间验证,如果 token 已过期,它将调用获取更新 token

检查下面的例子:我给出了 react axios 的例子

axios.interceptors.request.use(async (config) => {
  const expireAt = localStorage.getItem('expiresAt');
  let token = localStorage.getItem('authToken');
  if (dayjs(expireAt).diff(dayjs()) < 1) {
    const data = onGetForcedToken();
    token = typeof data === 'string' ? data : await data();
  }
  // setting updated token
  localStorage.setItem('authToken', token);
  return config;
}, (err) => {
   console.log("error in getting ",err)
});

关于reactjs - 如何在reactjs中使用刷新 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62229552/

相关文章:

javascript - 对象作为 React 子对象无效(在 android 4.4 的手机中,对于 React 15.6.1)

reactjs - 如何防止React Hook的useEffect多次取数据

android - 使用 Android Observer/Livedata/Coroutine/Kotlin 实现 Redux

php - CakePHP Auth 组件重定向问题

reactjs - 类型错误 : Cannot read property 'map' of undefined iwith react-redux

javascript - React JS 与 Redux 似乎不会重新渲染

javascript - 如何使用普通 JavaScript 和/或状态生成 future 日期?

javascript - 如何从 React Native 一次性导入所有组件?

sql-server - Transact-SQL 作业权限

php - symfony 登录事件