рд░рд┐рдПрдХреНрдЯ рдЯреЛрдХрди


рд╕рдорд╕реНрдпрд╛


рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдФрд░ рд╕рдмрд╕реЗ рдЖрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЗрдВ рд╕реЗ рдПрдХ (рдореЗрд░реЗ рдЕрдиреБрднрд╡ рд╕реЗ) рдЯреЛрдХрди рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рд╛рдзрд┐рдХрд░рдг (рдЖрдорддреМрд░ рдкрд░ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рд╣реИред


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


  • рдЯреЛрдХрди рдХреЛ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдкреЗрдЬ рд░реАрд▓реЛрдб рдкрд░ рдЯреЛрдХрди рдмрд╣рд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП
  • рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдпрджрд┐ рдЕрдВрддрд┐рдо рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рдмрд╛рдж рдЯреЛрдХрди рдкрд╣реБрдВрдЪ рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдХреЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдЙрдкрдпреБрдХреНрдд рдпреВрдЖрдИ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШрдЯрдХреЛрдВ рдХреА рдореВрд▓рднреВрдд рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
  • рд╕рдорд╛рдзрд╛рди рд╢реБрджреНрдз рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдмрд┐рдирд╛ Redux, рдердВрдХ, рдЖрджрд┐ ..)

рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдереЗ:


  • рд╕рд┐рдВрдХ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рд░рд╛рдЬреНрдп рдФрд░ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдбреЗрдЯрд╛ рдореЗрдВ рдХреИрд╕реЗ рд░рдЦреЗрдВ?
  • рдкреВрд░реЗ рддрддреНрд╡реЛрдВ рдХреЗ рдкреЗрдбрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рднреНрд░реВрдг рдХреЗ рдЕрдВрджрд░ рдЯреЛрдХрди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдпрджрд┐ рд╣рдо рдЗрд╕ рднреНрд░реВрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдж рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдердВрдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)

рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЪрд░рдг рджрд░ рдЪрд░рдг рд╣рд▓ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо token provider рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП token provider рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ auth provider рдмрдирд╛рдПрдВрдЧреЗ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ token provider рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП token provider рдЪрд╛рд░реЛрдВ рдУрд░ рд░реИрдкрд░, рд░рд┐рдПрдХреНрдЯрд░ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реБрдХ, рд╕реНрдЯреЗрд░реЙрдпрдб рдкрд░ рд▓рд╛рдиреЗ рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЗред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЗрдЦреЗрдВрдЧреЗред


рдореИрдВ рдмрд╕ npm install ... рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ npm install ... рдФрд░ рдЙрддреНрдкрд╛рджрди рдЬрд╛рдирд╛


рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкреИрдХреЗрдЬ рдЗрдХрдЯреНрдард╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рднреА (рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ) рд╣реИрдВред рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕реЗ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 npm install react-token-auth 

рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЯреЛрдХрди-рд╕реНрдерд┐рдд GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред


рд╕рдорд╛рдзрд╛рди


рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдПрдХ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдКрдВрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмреИрдХрдПрдВрдб рд╣реИ рдЬреЛ рдкрд╣реБрдВрдЪ рдФрд░ рддрд╛рдЬрд╝рд╛ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдореЗрдВ рдПрдХ JWT рдкреНрд░рд╛рд░реВрдк рд╣реИред рдРрд╕реА рд╡рд╕реНрддреБ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:


 { "accessToken": "...", "refreshToken": "..." } 

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


рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА


рдпрджрд┐ рдЖрдкрдХреЛ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ JWT рдЯреЛрдХрди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИ, рддреЛ jwt.io рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдм рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ JWT рдЯреЛрдХрди рдореЗрдВ (рдЖрдзрд╛рд░ Base64 рдкреНрд░рд╛рд░реВрдк рдореЗрдВ) рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬреЛ рдЙрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдЖрдорддреМрд░ рдкрд░ JWT рдЯреЛрдХрди рдореЗрдВ рдбреЙрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд 3 рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE1MTYyMzkwMjIsImV4cCI6MTUxNjIzOTAyMn0.yOZC0rjfSopcpJ-d3BWE8-BkoLR_SCqPdJpq8Wn-1Mc


рдпрджрд┐ рд╣рдо рдЗрд╕ рдЯреЛрдХрди рдХреЗ рдордзреНрдп рднрд╛рдЧ ( eyJu...Mn0 ) рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрдЧрд▓рд╛ JSON рдорд┐рд▓реЗрдЧрд╛:


 { "name": "John Doe", "iat": 1516239022, "exp": 1516239022 } 

рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде, рд╣рдо рдЯреЛрдХрди рдХреА рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред


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


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


  • getToken() рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ getToken() рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)
  • setToken() рд▓реЙрдЧрд┐рди, рд▓реЙрдЧрдЖрдЙрдЯ рдпрд╛ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдЯреЛрдХрди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  • isLoggedIn() рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рд╣реИ
  • subscribe() рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рдЯреЛрдХрди рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • unsubscribe() рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ unsubscribe()

рдлрд╝рдВрдХреНрд╢рди createTokenProvider() рд╡рд░реНрдгрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдЧрд╛:


 const createTokenProvider = () => { /* Implementation */ return { getToken, isLoggedIn, setToken, subscribe, unsubscribe, }; }; 

рд╕рднреА рдЕрдЧрд▓реЗ рдХреЛрдб createTokenProvider рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред


рдЖрдЗрдП рдЯреЛрдХрди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ (рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреГрд╖реНрда рдкреБрдирдГ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рддреНрд░ рдЦреЛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛):


 let _token: { accessToken: string, refreshToken: string } = JSON.parse(localStorage.getItem('REACT_TOKEN_AUTH') || '') || null; 

рдЕрдм рд╣рдореЗрдВ JWT рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рд╕рдордп рдореЗрдВ, JWT рдЯреЛрдХрди рдореИрдЬрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдлрд╝рдВрдХреНрд╢рди getExpirationDate() рдПрдХ JWT рдЯреЛрдХрди рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдЧрд╛ рдФрд░ рд╕рдлрд▓рддрд╛ рдкрд░ рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд▓реМрдЯрд╛рдПрдЧрд╛ (рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдкрд░ null ):


 const getExpirationDate = (jwtToken?: string): number | null => { if (!jwtToken) { return null; } const jwt = JSON.parse(atob(jwtToken.split('.')[1])); // multiply by 1000 to convert seconds into milliseconds return jwt && jwt.exp && jwt.exp * 1000 || null; }; 

рдФрд░ рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИ рд╣реИ isExpired() рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордпрд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИред рдпрджрд┐ рд╕рдорд╛рдкреНрддрд┐ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдкреНрд░рд╕реНрддреБрдд рдХреА рдЧрдИ рд╣реИ рдФрд░ рдпрд╣ Date.now() рд╕реЗ рдХрдо рд╣реИ рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рд╣реИред


 const isExpired = (exp?: number) => { if (!exp) { return false; } return Date.now() > exp; }; 

рдЯреЛрдХрди рдкреНрд░рджрд╛рддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордпред рдлрд╝рдВрдХреНрд╢рди getToken() рдХреЛ рдЯреЛрдХрди рд▓реМрдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди async рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреЛрдХрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХреНрд╕рдкрд╛рдпрд░ рдЯреЛрдХрди рдХреА рдЕрд╡рдзрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИ рдпрд╛ рдирд╣реАрдВ ( isExpired(getExpirationDate(_token.accessToken)) )ред рдФрд░ рдЯреЛрдХрди рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЯреЛрдХрди (рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди setToken() ) рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 const getToken = async () => { if (!_token) { return null; } if (isExpired(getExpirationDate(_token.accessToken))) { const updatedToken = await fetch('/update-token', { method: 'POST', body: _token.refreshToken }) .then(r => r.json()); setToken(updatedToken); } return _token && _token.accessToken; }; 

рдлрд╝рдВрдХреНрд╢рди isLoggedIn() рд╕рд░рд▓ рд╣реЛрдЧрд╛: рдпрд╣ рд╕рд╣реА рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЕрдЧрд░ _tokens null рдирд╣реАрдВ рд╣реИ рдФрд░ рдЯреЛрдХрди рд╕рдорд╛рдкреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЯреЛрдХрди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрдм рддрдХ рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ , рдФрд░ рд╣рдореЗрдВ рдлрдВрдХреНрд╢рди рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИред рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ):


 const isLoggedIn = () => { return !!_token; }; 

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


 let observers: Array<(isLogged: boolean) => void> = []; 

рдЕрдм рд╣рдо рддрд░реАрдХреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ subscribe() рдФрд░ unsubscribe() ред рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдСрдмреНрдЬрд░реНрд╡рд░ рдереЛрдбрд╝рд╛ рдкрд╣рд▓реЗ рд╡рд╛рд▓реА рд╕рд░рдгреА рдореЗрдВ рдирдпрд╛ рдСрдмреНрдЬрд░реНрд╡рд░ рдЬреЛрдбрд╝реЗрдЧрд╛, рджреВрд╕рд░рд╛ рд╡реНрдпрдХреНрддрд┐ рдкреНрд░реЗрдХреНрд╖рдХ рдХреЛ рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛ рджреЗрдЧрд╛ред


 const subscribe = (observer: (isLogged: boolean) => void) => { observers.push(observer); }; const unsubscribe = (observer: (isLogged: boolean) => void) => { observers = observers.filter(_observer => _observer !== observer); }; 

рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ subscribe() рдФрд░ unsubscribe() рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЛ рднреЗрдЬ рджреЗрдВрдЧреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рд╣реИред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рдВрдкреВрд░реНрдг рдЯреЛрдХрди, рд╕рдорд╛рдкреНрддрд┐ рд╕рдордп, рдЖрджрд┐ ...)ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмреВрд▓рд┐рдпрди рдзреНрд╡рдЬ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред


рдЖрдЗрдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрдкрдпреЛрдЧ рдлрдВрдХреНрд╢рди notify() рдмрдирд╛рдПрдВ рдЬреЛ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд▓реЗрдЧрд╛ рдФрд░ рд╕рднреА рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЛ рднреЗрдЬреЗрдЧрд╛:


 const notify = () => { const isLogged = isLoggedIn(); observers.forEach(observer => observer(isLogged)); }; 

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


 const setToken = (token: typeof _token) => { if (token) { localStorage.setItem('REACT_TOKEN_AUTH', JSON.stringify(token)); } else { localStorage.removeItem('REACT_TOKEN_AUTH'); } _token = token; notify(); }; 

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


рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдкреНрд░рджрд╛рддрд╛


рдЖрдЗрдП рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдПрдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣реЗрдВрдЧреЗред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ 4 рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗ: рд╣реБрдХ рдХрд╛ useAuth() рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рд╕реЗ рддрд╛рдЬрд╛ рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯреЛрдХрди рдФрд░ login() рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, authFetch() login() , logout() рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬреЛ рд╡рд┐рдзрд┐ setToken() рдкреНрд░реЙрдХреНрд╕реА рдХреЙрд▓ setToken() рдЯреЛрдХрди рдкреНрд░рджрд╛рддрд╛ рдХрд╛) (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реА рдмрдирд╛рдИ рдЧрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛, рдФрд░ рдмрд╛рдХреА рдХреЛрдб рдХреЛ рдЯреЛрдХрди рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдореМрдЬреВрджрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛)ред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣рдо рдлрдВрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ:


 export const createAuthProvider = () => { /* Implementation */ return { useAuth, authFetch, login, logout } }; 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрджрд┐ рд╣рдо рдПрдХ рдЯреЛрдХрди рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 const tokenProvider = createTokenProvider(); 

рддрд░реАрдХреЗ login() рдФрд░ logout() рдмрд╕ рдЯреЛрдХрди рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдЯреЛрдХрди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдЕрд░реНрде рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХрд┐рдпрд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд╛рд▓реА / рдЕрд╢рдХреНрдд рдЯреЛрдХрди рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рд╕реЗ рдбреЗрдЯрд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):


 const login: typeof tokenProvider.setToken = (newTokens) => { tokenProvider.setToken(newTokens); }; const logout = () => { tokenProvider.setToken(null); }; 

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


рдлрд╝реЗрдЪ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛ рддрд░реНрдХ рд▓реЗрдиреЗ рдЪрд╛рд╣рд┐рдП: рдЕрдиреБрд░реЛрдз рдЬрд╛рдирдХрд╛рд░реА (рдЖрдорддреМрд░ рдкрд░ URL) рдФрд░ рдЕрдиреБрд░реЛрдз init (рд╡рд┐рдзрд┐, рдирд┐рдХрд╛рдп рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБред рд╣реЗрдбрд░ рдФрд░ рдЗрддрдиреЗ рдкрд░); рдФрд░ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ:


 const authFetch = async (input: RequestInfo, init?: RequestInit): Promise<Response> => { const token = await tokenProvider.getToken(); init = init || {}; init.headers = { ...init.headers, Authorization: `Bearer ${token}`, }; return fetch(input, init); }; 

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣рдордиреЗ рджреЛ рдЪреАрдЬреЗрдВ рдмрдирд╛рдИрдВ: рдЯреЛрдХрди рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдЯреЛрдХрди рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдпрд╛рди рдХрд╛ await tokenProvider.getToken(); рдХрд░реЗрдВ рдЯреЛрдХрди await tokenProvider.getToken(); ( getToken рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рдмрд╛рдж рдЯреЛрдХрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ) рдФрд░ рдЗрд╕ рдЯреЛрдХрди рдХреЛ рд▓рд╛рдЗрди рдореЗрдВ getToken Authorization рджреНрд╡рд╛рд░рд╛ Authorization рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Authorization: 'Bearer ${token}' ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдХреЗрд╡рд▓ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред


рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдЯреЛрдХрди рдмрдЪрд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рд╕реЗ рдЯреЛрдХрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдордпред


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛ рдерд╛ рдХрд┐ рд╣рдо рдПрдХ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ useAuth() рдЬреЛ рдШрдЯрдХ рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ useState() ред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХреЛрдВ рдХреЗ рд░реЗрдВрдбрд░рд░ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред


рдФрд░ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реБрдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред рд╣реБрдХ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реБрдирдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ useEffect() ред рдпрд╣ рд╣реБрдХ рджреЛ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ: рдХрд╛рд░реНрдп рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕реВрдЪреАред рдЙрдкрдпреЛрдЧ рдХреА рдкрд╣рд▓реА рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдлрд┐рд░ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рд╕реНрдерд╛рдиреАрдп рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯ рд╕рдХрддреЗ рд╣реИрдВ ... рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдФрд░, рдЗрд╕ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдпрд╛ рддреЛ рдкрд╣рд▓реЗ рдПрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рдШрдЯрдХ рдХреЗ рдЕрдирдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдирдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЛ рд╕реБрдирдирд╛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдХрдо рд╕реЗ рдХрдо рдпрджрд┐ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ)ред рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдХреЛрдб рджреЗрдЦреЗрдВ:


 const useAuth = () => { const [isLogged, setIsLogged] = useState(tokenProvider.isLoggedIn()); useEffect(() => { const listener = (newIsLogged: boolean) => { setIsLogged(newIsLogged); }; tokenProvider.subscribe(listener); return () => { tokenProvider.unsubscribe(listener); }; }, []); return [isLogged] as [typeof isLogged]; }; 

рдФрд░ рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╣рдордиреЗ рдЕрднреА рд╕реНрдкрд╖реНрдЯ API рдХреЗ рд╕рд╛рде рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдЯреЛрдХрди рд╕реНрдЯреЛрд░реЗрдЬ рд╕реНрдЯреЛрд░реЗрдЬ рдмрдирд╛рдпрд╛ рд╣реИред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред


рдкреНрд░рдпреЛрдЧ


рдКрдкрд░ рд╣рдордиреЗ рдЬреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдкреНрд░рджрд╛рддрд╛ рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдХрд╛рд░реНрдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ useAuth() , authFetch() , login() , logout() рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдПрдХ рд╣реА рдЯреЛрдХрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ (рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреБрдЫ рднреА рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдСрд╡рд░ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдмрдирд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕реНрдерд╛рдиреАрдп рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреБрдВрдЬреА рдХреЛ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 export const {useAuth, authFetch, login, logout} = createAuthProvider(); 

рд▓реЙрдЧ рдЗрди рдлреЙрд░реНрдо


рдЕрдм рд╣рдо рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓реЗред рдЖрдЗрдП рд▓реЙрдЧрд┐рди рдлреЙрд░реНрдо рдШрдЯрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред рдЗрд╕ рдШрдЯрдХ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рд╛рдЦ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдкрд░ рд╣рдореЗрдВ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдЯреЛрдХрди рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди login() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 const LoginComponent = () => { const [credentials, setCredentials] = useState({ name: '', password: '' }); const onChange = ({target: {name, value}}: ChangeEvent<HTMLInputElement>) => { setCredentials({...credentials, [name]: value}) }; const onSubmit = (event?: React.FormEvent) => { if (event) { event.preventDefault(); } fetch('/login', { method: 'POST', body: JSON.stringify(credentials) }) .then(r => r.json()) .then(token => login(token)) }; return <form onSubmit={onSubmit}> <input name="name" value={credentials.name} onChange={onChange}/> <input name="password" value={credentials.password} onChange={onChange}/> </form> }; 

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


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


рд░реВрдЯрд░


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


 export const Router = () => { const [logged] = useAuth(); return <BrowserRouter> <Switch> {!logged && <> <Route path="/register" component={Register}/> <Route path="/login" component={Login}/> <Redirect to="/login"/> </>} {logged && <> <Route path="/dashboard" component={Dashboard} exact/> <Redirect to="/dashboard"/> </>} </Switch> </BrowserRouter>; }; 

рдФрд░ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд╣реИред


рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


рдФрд░ рддрдм рд╣рдо рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреИрд╕реЗ рдХрд┐, рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рдореЗрдВ authFetch рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╕ рдЗрд╕реЗ authFetch рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:


 const Dashboard = () => { const [posts, setPosts] = useState([]); useEffect(() => { authFetch('/posts') .then(r => r.json()) .then(_posts => setPosts(_posts)) }, []); return <div> {posts.map(post => <div key={post.id}> {post.message} </div>)} </div> }; 

рд╕рд╛рд░рд╛рдВрд╢


рд╣рдордиреЗ рдХрд░ рджрд┐рдЦрд╛рдпрд╛ред рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдпрд╛рддреНрд░рд╛ рдереА, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЕрдВрдд рднреА рд╣реИ (рд╢рд╛рдпрдж рдЦреБрд╢ рднреА)ред


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


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


рдпрд╣рд╛рдВ рдореИрдВ рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдерд╛ред

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


All Articles