как обновить sh токен доступа с помощью рефре sh токена? - PullRequest
1 голос
/ 01 апреля 2020

У меня проблема с истечением срока действия токена, и я хочу обновить sh с помощью токена. У меня есть два метода, один из которых показывает учетные записи и использует топор ios post, а другой - refre sh token.

export const add_account = account=>{
    var token=localStorage.getItem("access_token")
      var decoded=jwt_decode(token);
        var time_exp=decoded.exp;
        if(time_exp<new Date().getTime()/1000) {
            refreshToken();
        }
    return axios.post("http://localhost:5000/accounts",{
        acc_name:account.name,
        acc_pass:account.pass,
        acc_host:account.host,
        acc_description:account.description
   }, {headers: {
    'Authorization': `Bearer ${localStorage.getItem('access_token')}`
        }}).then(res=>{
        return res.data
    })
}

Второй метод - refre sh, и в отладке я замечаю, что первый go для обновления sh функции токена и при вводе в эту функцию go до .then (res => .... и после этого go возврат к первой функции процесса возврата топора ios .post и видим, что срок действия access_token истек. После этого go возвращается к refreshToken () и затем устанавливается access_token локального хранилища.

export const refreshToken=()=>{
return axios.post("http://localhost:5000/refresh",null,{headers: {
'Authorization': `Bearer ${localStorage.getItem("refresh_token")}`
    }}).then(res=>{
        localStorage.setItem('access_token',res.data['access_token']);
        return res.data;
}).catch(e=>{
    console.log(e)
})

}

1 Ответ

1 голос
/ 01 апреля 2020

Мне кажется, что функция refreshToken работает параллельно с вашей функцией входа в систему, потому что вы не ждете, пока функция refreshToken завершится. Вы можете попытаться изменить первый на асинхронную c функцию и дождаться результата.

export const add_account = async account=>{
    var token=localStorage.getItem("access_token")
      var decoded=jwt_decode(token);
        var time_exp=decoded.exp;
        if(time_exp<new Date().getTime()/1000) {
           await refreshToken();
        }

    return axios.post("http://localhost:5000/accounts",{
        acc_name:account.name,
        acc_pass:account.pass,
        acc_host:account.host,
        acc_description:account.description
   }, {headers: {
    'Authorization': `Bearer ${localStorage.getItem('access_token')}`
        }}).then(res=>{
        return res.data
    })
}

Возможно, было бы более разумно использовать стиль, чтобы также использовать синтаксис then вместо asyn c await, но тогда вам нужно будет указать два пути выполнения (один с refreshToken, а другой без), что кажется запутанным.

...