рдЯреЛрдХрди, рддрд╛рдЬрд╝рд╛ рдЯреЛрдХрди, рдФрд░ REST рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЖрд╡рд░рдг рдмрдирд╛

рдЫрд╡рд┐ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЕрдиреБрд░реЛрдз рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ "рдЖрд╡рд░рдг" рдмрдирд╛рдПрдВ, рдЬреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╕рдордп рдкрд░ рдЕрджреНрдпрддрди рдХрд░реЗрдЧрд╛ред

рдЬрд╛рдирдХрд╛рд░реА рд▓реЙрдЧрд┐рди рдХрд░реЗрдВ


рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬрд╣рд╛рдВ рд╣рдордиреЗ рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рднреЗрдЬрд╛ рд╣реИ, рдмрджрд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рдирд┐рдореНрди рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИ (рдорд╛рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд▓рд╛рдЗрдиреЗрдВ рдЖрдорддреМрд░ рдкрд░ рд▓рдВрдмреА рд╣реЛрддреА рд╣реИрдВ):

{ "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSld", "refresh_token": "1eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgS", "expires_in": 124234149563 } 

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдФрд░ рднреА рдХреНрд╖реЗрддреНрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "token_type" , "expires_on" , рдЗрддреНрдпрд╛рджрд┐, рд▓реЗрдХрд┐рди, рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЙрдкрд░реЛрдХреНрдд рддреАрди рдлрд╝реАрд▓реНрдб рдЪрд╛рд╣рд┐рдПред
рдЖрдЗрдП рдЙрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

  • access_token - рд╡рд╣ рдЯреЛрдХрди рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛
  • рд░рд┐рдлреНрд░реЗрд╢_рдЯреЛрдХрди - рдПрдХ рдЯреЛрдХрди рдЬрд┐рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдирдпрд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛
  • expires_in - рд╕реЗрдХрдВрдб рдореЗрдВ рдЯреЛрдХрди рдЬреАрд╡рдирдХрд╛рд▓

рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдЕрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЬрд╕рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред

рд╣рдо рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реЗрд╢рдирд╕реНрдЯреНрд░реЗрд╢рди рдпрд╛ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдСрдерд░рд╛рдЗрдЬреЗрд╢рди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдЯрд╛ рддрдм рддрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдЯрд╛ рдХреЛ рдЕрд╕реАрдорд┐рдд рд╕рдордп рддрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╕реНрдерд╛рдиреАрдпрд╕реНрдЯреЛрд░ рд╕рд╛рдлрд╝ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реЗрд╢рди рдореЗрдВ рдЯреЛрдХрди рдХреЛ рдмрдЪрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп


 function saveToken(token) { sessionStorage.setItem('tokenData', JSON.stringify(token)); } 

рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп:


 function getTokenData(login, password) { return fetch('api/auth', { method: 'POST', credentials: 'include', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', }, body: JSON.stringify({ login, password, }), }) .then((res) => { if (res.status === 200) { const tokenData = res.json(); saveToken(JSON.stringify(tokenData)); //     sessionStorage,   ,   return Promise.resolve() } return Promise.reject(); }); } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ "access_token" , "refresh_token" рдФрд░ "expires_in" рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдФрд░ рдЗрд╕реЗ рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реЗрд╢рдирд╕реНрдЯреЛрд░ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ред

рдЯреЛрдХрди рдЕрдкрдбреЗрдЯ


рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдЯреЛрдХрди рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рд╕реАрдорд┐рдд рд╣реИ, рдЬреЛ "expires_in" рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕реЗрдЯ рд╣реИред рдЗрд╕рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЗрд╕ рдЯреЛрдХрди рдХреЛ рднреЗрдЬрдХрд░ рдирдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдо рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рднреЗрдЬрдХрд░ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рд░ рдмрд╛рд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИ - рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╕реНрд╡рдд: рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдореЗрдВ рдХрд╣реАрдВ рд▓реЙрдЧрд┐рди / рдкрд╛рд╕рд╡рд░реНрдб рдЬреЛрдбрд╝реА рдЬрдорд╛ рдХрд░рдирд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЗрд╕реАрд▓рд┐рдП рд╣рдореЗрдВ рд░рд┐рдлреНрд░реЗрд╢_рдЯреЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ , рдЬреЛ рдкрд╣рд▓реЗ access_token рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рдереА рдФрд░ рд╕реЗрд╢рдирд╕реНрдЯреЛрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рд╣реИред рдЖрдкреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рджреВрд╕рд░реЗ рдкрддреЗ рдкрд░ рдпрд╣ рдЯреЛрдХрди рднреЗрдЬрдХрд░, рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ "рддрд╛рдЬрд╝рд╛" рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЯреЛрдХрди рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди


 function refreshToken(token) { return fetch('api/auth/refreshToken', { method: 'POST', credentials: 'include', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', }, body: JSON.stringify({ token, }), }) .then((res) => { if (res.status === 200) { const tokenData = res.json(); saveToken(JSON.stringify(tokenData)); //      sessionStorage,   ,   return Promise.resolve(); } return Promise.reject(); }); } 

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рд╕реЗрд╢рдирд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдЯреЛрдХрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдФрд░ рдЕрдм рд╣рдо рдирдП рддрд░реАрдХреЗ рд╕реЗ рдПрдкреАрдЖрдИ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЖрд╡рд░рдг рд╕рдорд╛рд░реЛрд╣ рдмрдирд╛рдирд╛


рдЕрдм рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреБрд░реЛрдз рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред

рдЪреВрдВрдХрд┐ рдпрджрд┐ рдЯреЛрдХрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдирдП рдЯреЛрдХрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЖрд╡рд░рдг рд╕рдорд╛рд░реЛрд╣


 export async function fetchWithAuth(url, options) { const loginUrl = '/login'; // url    let tokenData = null; //    tokenData if (sessionStorage.authToken) { //   sessionStorage  tokenData,    tokenData = JSON.parse(localStorage.tokenData); } else { return window.location.replace(loginUrl); //   ,       } if (!options.headers) { //     headers,    options.headers = {}; } if (tokenData) { if (Date.now() >= tokenData.expires_on * 1000) { //        try { const newToken = await refreshToken(tokenData.refresh_token); //  ,      refresh_token saveToken(newToken); } catch () { //   -   ,       return window.location.replace(loginUrl); } } options.headers.Authorization = `Bearer ${tokenData.token}`; //    headers  } return fetch(url, options); //   ,       headers } 

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЬреЛ рдПрдкреАрдЖрдИ рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЛрдХрди рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде, рд╣рдо рдЙрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдмрджрд▓рдиреЗ рдпрд╛ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдФрд░ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ "рдЖрдпрд╛рдд" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рд▓рд╛рдиреЗ рдХреА рдЬрдЧрд╣ рд▓реЗрдЧрд╛ред

 import fetchWithAuth from './api'; function getData() { return fetchWithAuth('api/data', options) } 

Source: https://habr.com/ru/post/hi456188/


All Articles