مشکات
2 سال پیش توسط مشکات مطرح شد
6 پاسخ

refreshtoken

سلام
خسته نباشید
در برنامه ی من زمانیکه کاربر لاگین میکنه یک access_token,یک refresh_token و یک expire_in دریافت میکنه
بعد از یک دقیقه access_token منقضی میشه
در این لحظه یک درخواست به همراه اون refresh_token ارسال میشه و یک access_token,یک refresh_token و یک expire_in جدید دریافت میشه
وقتی هم که refresh_token منقضی بشه کاربر به صفحه ی لاگین میره
کدم به صورت زیر هست

  .catch(err => {
            // console.log(err.response.status);
            if(err.response.status === 401){
                console.log("Unauthorized");
                const result = axios
                .post("http://localhost:8000/oauth/token", this.refresh)
                .then((response) => {
                localStorage.setItem("token", response.data.access_token);
                localStorage.setItem("refresh_token", response.data.refresh_token);
                // eventBus.emit("showlog" , this.log);
                axios.get('http://localhost:8000/api/posts',{
                headers: 
                {
                    'Authorization': 'Bearer ' + localStorage.getItem('token'),
                    'Accept': 'application/json'
                }
                })
                    .then((response)=>{
                        this.posts = response.data;
                    })
                    .catch(err => console.log("error"))

                })
                .catch(err => {
                    if(err.response.status === 401){
                        console.log("Unauthorized");
                        localStorage.removeItem("token");
                        localStorage.removeItem("refresh_token");
                        this.$router.push({ name: "LoginRegister" });

                    }

                })

            }
        })  

این کد برام درست اجرا میشه
میخواستم بدونم چطور میتونم همین کد رو به صورت global در برنامه بنویسم
ممنون میشم راهنماییم کنید🌺


ثبت پرسش جدید
فاطمه کاظمی زاده
تخصص : Senior front-end در هولدینگ دک...
@kazemi 2 سال پیش مطرح شد
0

سلام. میتونین در ریداکس تعریفش کنین و درهمه برنامه بهش دسترسی داشته باشید


مشکات
تخصص : کاراموز
@meshkat315 2 سال پیش مطرح شد
0

سلام بانو@kazemi
من از vuejs3 استفاده میکنم
چطوری میتونم از ریداکس استفاده کنم؟


میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 2 سال پیش مطرح شد
0

داخل مولفه ریشه <App> بنویسیدش.


مشکات
تخصص : کاراموز
@meshkat315 2 سال پیش آپدیت شد
0

سلام
من به این نتیجه رسیدم که ریداکس برای کد من کاربردی نیست
در واقع من میخوام یک تیکه کد به ازای همه ی درخواست ها برای من اجرا بشه
میخوام بدونم چطور میشه اینکارو کرد؟


فاطمه کاظمی زاده
تخصص : Senior front-end در هولدینگ دک...
@kazemi 2 سال پیش آپدیت شد
0

ببین من توی ری اکت یه چنین کاری انجام میدم
ساز و کارشو برات مینویسم سرچ بزن شاید توی ویو جی اس هم شدنی بود

من توی ری اکت وب سرویسهارو با یه پکیج صدا میزنم مثل axios
این پکیج ها یه چیزی داره به اسم مانیتورینگ
یعنی به ازای هر. درخواستی که به سرور ارسال میشه میتونی مانیتورینگ انجام بدی و خیلی چیزها رو چک کنی و خیلی چیزهارو قبل از ریسپانس بررسی کنی
مثلا توی مانیتورینگ من تمام وب سرویسهارو یکبار چک میکنم که اگه خطای ۴۲۲ داد سریع اونجا سرویس لاگ اوت رو صدا میزنم و همونجا میگم باید دوباره لاگین کنی و هدایتش میکنم به صفحه لاگین

چنین چیزی توی ویو هم باید باشه
مثلا توی ریداکست یه اکشن بنویسی برای کاری که میخوای انجام بدی و بعد توی مانیتورینگ اون شرایط مورد نظرتو بررسی کنی و اون اکشن رو صدا بزنی

اصطلاحا بهش watch api یا incerpretor یا مانیتورینگ api هم میگن با این کلمات میتونی سرچ کنی


مشکات
تخصص : کاراموز
@meshkat315 2 سال پیش آپدیت شد
0

سلام @kazemi
صبحتون بخیر
خیلی خیلی ممنونم از توضیح خوبتون😘🌺
بله با interceptorتونستم کد رو بنویسم
این کد من هست

import axios from 'axios'
// apply interceptor on response
axios.interceptors.response.use(function (response) {
  if (response.status === 200 && response.data.message) {
    console.log("salam")
  }
  if (response.status === 201 && response.data.message) {
    console.log("salam salam");
  }
  return response
}, function (error) {
  let   expireRefreshToken= false;
  // Do something with response error
  // check for errorHandle config

  // if has response show the error
  if (error.response) {
    if (error.response.status === 404 || error.response.status === 400) {
      console.log("400 error code ");
      console.error(error.response.data.message)
    }
    if (error.response.status === 401 ) {
        // console.log(expireRefreshToken);

        console.log("Unauthorized");
        const result = axios
        .post("http://localhost:8000/oauth/token",{
          refresh_token: localStorage.getItem("refresh_token"), 
          grant_type: "refresh_token",
          client_id: "4", 
          client_secret:"GC97kY9kKuhnk8byBlYcMA2gTRuUw3qLWxHuLcZh"
        })
        .then((response) => {
          console.log("refresh token")
        // console.log( response.data.access_token);
        localStorage.setItem("token", response.data.access_token);
        localStorage.setItem("refresh_token", response.data.refresh_token);
        console.log("token has been refreshed");
        })
        .catch(err => {
          if(err.response.status === 401 && expireRefreshToken === false){

           console.log("expiredRefreshToken");
           localStorage.removeItem("token");
           expireRefreshToken = true;
           console.log(expireRefreshToken);
            // return Promise.reject(error);
           router.push("/loginRegister");
          }

      })

    }

    if (error.response.status === 401 && expireRefreshToken === true) {

         console.log("Unauthorized");
         router.push("/loginRegister");

  }

  }

  return Promise.reject(error)
}
)

اما الان مشکلی که هست بعد از expireشدن توکن به صورت بی وقفه requestارسال میشه
 تصویر

تا زمانیکه بهم این ارور رو میده
[HTTP/1.1 429 Too Many Requests 26ms]


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام