【问题标题】:Running a "refresh token" function from reactjs every X minutes每 X 分钟从 reactjs 运行一个“刷新令牌”函数
【发布时间】:2022-11-13 03:07:15
【问题描述】:

我正在尝试使用刷新令牌每隔几分钟刷新一次身份验证令牌。我的问题是令牌保存在Context 中(在必要时使用useContext 检索它)并且我正在努力使用类似setInterval 的函数来读取当前令牌,将其发布到服务器并在该州更新它。

这就是我想要做的:

  const {
    tryLocalSignIn,
    signin,
    signout,
    state: AuthState,
  } = useContext(AuthContext);

...

let id = setInterval(async () => {
  let token = AuthState.token;
  let refreshToken = AuthState.refreshToken;
  console.log("Running refresh token", token, refreshToken);
  let answer = await ApiRefreshToken(token, refreshToken);
  if (answer.status !== 200) {
    setError("Error using refresh token");
    return;
  }
  signin({
    token: answer.data.token,
    refreshToken: answer.data.refreshToken,
    expires_in: answer.data.expires_in,
  });
}, 15000);

...

但我无法从 AuthState 中读取

【问题讨论】:

    标签: reactjs state react-context refresh-token


    【解决方案1】:

    从您提供的代码中不确定它的结构,但您是否尝试将AuthState 传递给 setInterval 回调函数?如在

    let id = setInterval(async (state) => {...}, 15000);
    

    然后您通过state.token 或其他方式访问令牌?

    【讨论】:

    • 你的意思是:let id = setInterval(async (state) => {...}, 15000, AuthState);
    • 是的,类似的东西
    • 试过了,还是不行。。
    • let id = setInterval(async (AuthState) => {...}, 15000, state); 怎么样?
    【解决方案2】:

    看起来很可能 setInterval 指的是陈旧状态, 如果 setInterval 在 useEffect 中,那么您可能需要 useRef 才能访问最新版本的变量

     const SomeComponent = (props) => {
     
        const {
         tryLocalSignIn,
         signin,
         signout,
         state: AuthState,
        } = useContext(AuthContext);
    
         const AuthStateRef = useRef(AuthState)
         AuthStateRef.current = AuthState;
      
        .....
     
        useEffect(() =>  {
    
            let id = setInterval(async () => {
            let token = AuthStateRef.current.token;
            let refreshToken = AuthState.refreshToken;
            console.log("Running refresh token", token, refreshToken);
             let answer = await ApiRefreshToken(token, refreshToken);
              if (answer.status !== 200) {
              setError("Error using refresh token");
               return;
              }
              signin({
               token: answer.data.token,
               refreshToken: answer.data.refreshToken,
               expires_in: answer.data.expires_in,
              });
             }, 15000);
    
             return () => {
                clearInterval(id)
             }
    
        }, [])  // check dependencies 
       
    
     } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2014-12-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      相关资源
      最近更新 更多