HTML Diff
1 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Представим, что мы разрабатываем страницу с профилем пользователя в социальной сети. У пользователей есть возможность редактировать свои профили. Нам нужно определять, что HTTP-запрос на изменение профиля пришел от владельца профиля. Если не сделать такую проверку, то злоумышленники смогут изменять данные профилей других пользователей.</p>
1 <p>Представим, что мы разрабатываем страницу с профилем пользователя в социальной сети. У пользователей есть возможность редактировать свои профили. Нам нужно определять, что HTTP-запрос на изменение профиля пришел от владельца профиля. Если не сделать такую проверку, то злоумышленники смогут изменять данные профилей других пользователей.</p>
2 <p>В этом уроке мы разберем тему JWT-авторизации и ее реализацию в Go. Это важная тема, потому что авторизация - это ключевая часть безопасности любого веб-приложения.</p>
2 <p>В этом уроке мы разберем тему JWT-авторизации и ее реализацию в Go. Это важная тема, потому что авторизация - это ключевая часть безопасности любого веб-приложения.</p>
3 <h2>Аутентификация и авторизация</h2>
3 <h2>Аутентификация и авторизация</h2>
4 <p>Представим, что мы хотим войти в свой аккаунт социальной сети. Веб-сайту нужно понять, что мы владеем этим аккаунтом. Для этого нам нужно предоставить корректные учетные данные. Обычно это логин и пароль. Веб-сайт проверяет эти данные и, если они верны, мы входим в свой аккаунт. Этот процесс называется<strong>аутентификацией</strong>:</p>
4 <p>Представим, что мы хотим войти в свой аккаунт социальной сети. Веб-сайту нужно понять, что мы владеем этим аккаунтом. Для этого нам нужно предоставить корректные учетные данные. Обычно это логин и пароль. Веб-сайт проверяет эти данные и, если они верны, мы входим в свой аккаунт. Этот процесс называется<strong>аутентификацией</strong>:</p>
5 <p>Допустим, после успешной аутентификации мы заходим на страницу со своим профилем. Так как мы уже были аутентифицированы, мы можем отправить запрос на редактирование данных профиля. Веб-сайт проверяет, что запрос пришел от владельца профиля, и позволяет изменять данные. Процесс проверки прав на осуществление действий называется<strong>авторизацией</strong>:</p>
5 <p>Допустим, после успешной аутентификации мы заходим на страницу со своим профилем. Так как мы уже были аутентифицированы, мы можем отправить запрос на редактирование данных профиля. Веб-сайт проверяет, что запрос пришел от владельца профиля, и позволяет изменять данные. Процесс проверки прав на осуществление действий называется<strong>авторизацией</strong>:</p>
6 <p>Таким образом, аутентификация - это процесс проверки учетных данных, а авторизация - это процесс проверки прав на осуществление действий. В примере социальной сети аутентификация происходит при логине, а авторизация при каждом запросе после аутентификации.</p>
6 <p>Таким образом, аутентификация - это процесс проверки учетных данных, а авторизация - это процесс проверки прав на осуществление действий. В примере социальной сети аутентификация происходит при логине, а авторизация при каждом запросе после аутентификации.</p>
7 <p>Процесс авторизации происходит часто, и если допустить ошибку в системе авторизации, то злоумышленники смогут осуществлять действия от имени других пользователей. Например, сделать покупку от их имени или узнать конфиденциальную информацию. Поэтому важно знать безопасные и проверенные способы авторизации.</p>
7 <p>Процесс авторизации происходит часто, и если допустить ошибку в системе авторизации, то злоумышленники смогут осуществлять действия от имени других пользователей. Например, сделать покупку от их имени или узнать конфиденциальную информацию. Поэтому важно знать безопасные и проверенные способы авторизации.</p>
8 <p>Два самых популярных способа авторизации:</p>
8 <p>Два самых популярных способа авторизации:</p>
9 <ul><li>С помощью сессий</li>
9 <ul><li>С помощью сессий</li>
10 <li>С помощью токенов</li>
10 <li>С помощью токенов</li>
11 </ul><p>У каждого из этих способов есть свои уникальности, преимущества и недостатки. Ознакомиться более детально с ними можно в дополнительных материалах к уроку. Мы же рассмотрим на практике одну из реализаций авторизации с помощью токенов - JWT.</p>
11 </ul><p>У каждого из этих способов есть свои уникальности, преимущества и недостатки. Ознакомиться более детально с ними можно в дополнительных материалах к уроку. Мы же рассмотрим на практике одну из реализаций авторизации с помощью токенов - JWT.</p>
12 <h2>JWT-авторизация</h2>
12 <h2>JWT-авторизация</h2>
13 <p><strong>JWT (JSON Web Token)</strong>- это специальный формат токена, который позволяет безопасно передавать данные между клиентом и сервером. Например, клиентом может быть веб-браузер или мобильное приложение, сервером - сервер с Go веб-приложением.</p>
13 <p><strong>JWT (JSON Web Token)</strong>- это специальный формат токена, который позволяет безопасно передавать данные между клиентом и сервером. Например, клиентом может быть веб-браузер или мобильное приложение, сервером - сервер с Go веб-приложением.</p>
14 <p>JWT-токен состоит из трех частей, которые разделены точкой:</p>
14 <p>JWT-токен состоит из трех частей, которые разделены точкой:</p>
15 <ul><li><strong>Header</strong>или<strong>заголовок</strong>- информация о токене, тип токена и алгоритм шифрования</li>
15 <ul><li><strong>Header</strong>или<strong>заголовок</strong>- информация о токене, тип токена и алгоритм шифрования</li>
16 <li><strong>Payload</strong>или<strong>полезные данные</strong>- данные, которые мы хотим передать в токене. Например, имя пользователя, его роль, истекает ли токен. Эти данные представлены в виде JSON-объекта</li>
16 <li><strong>Payload</strong>или<strong>полезные данные</strong>- данные, которые мы хотим передать в токене. Например, имя пользователя, его роль, истекает ли токен. Эти данные представлены в виде JSON-объекта</li>
17 <li><strong>Signature</strong>или<strong>подпись</strong>- подпись токена, которая позволяет проверить, что токен не был изменен</li>
17 <li><strong>Signature</strong>или<strong>подпись</strong>- подпись токена, которая позволяет проверить, что токен не был изменен</li>
18 </ul><p>Обычный токен имеет формат:</p>
18 </ul><p>Обычный токен имеет формат:</p>
19 <p>Рассмотрим пример реального токена с разбором каждой части. Предположим, наше веб-приложение сгенерировало следующий JWT-токен:</p>
19 <p>Рассмотрим пример реального токена с разбором каждой части. Предположим, наше веб-приложение сгенерировало следующий JWT-токен:</p>
 
20 + <h3>Header</h3>
20 <p>Заголовок обычно состоит из JSON-объекта с двумя свойствами:</p>
21 <p>Заголовок обычно состоит из JSON-объекта с двумя свойствами:</p>
21 <ul><li>Тип токена, который в нашем случае -<em>JWT</em></li>
22 <ul><li>Тип токена, который в нашем случае -<em>JWT</em></li>
22 <li>Алгоритм шифрования, который в нашем случае -<em>HMAC SHA256</em></li>
23 <li>Алгоритм шифрования, который в нашем случае -<em>HMAC SHA256</em></li>
23 </ul><p>Далее этот JSON-объект хэшируется с помощью<em>Base64Url-кодирования</em>, чтобы представить его в виде компактной строки.</p>
24 </ul><p>Далее этот JSON-объект хэшируется с помощью<em>Base64Url-кодирования</em>, чтобы представить его в виде компактной строки.</p>
24 <p>Таким образом, в нашем примере заголовок JWT-токена имеет следующее значение:</p>
25 <p>Таким образом, в нашем примере заголовок JWT-токена имеет следующее значение:</p>
25 <h3>Payload</h3>
26 <h3>Payload</h3>
26 <p>Вторая часть токена - это полезная нагрузка в виде JSON-объекта. Она содержит различные данные об авторизованном пользователе. Значение этой части JWT-токена различно в каждом веб-приложении. Мы можем записать здесь любые публичные данные, которые могут быть полезны при авторизации.</p>
27 <p>Вторая часть токена - это полезная нагрузка в виде JSON-объекта. Она содержит различные данные об авторизованном пользователе. Значение этой части JWT-токена различно в каждом веб-приложении. Мы можем записать здесь любые публичные данные, которые могут быть полезны при авторизации.</p>
27 <p>Как и заголовок JWT-токена, полезная нагрузка хэшируется с помощью<em>Base64Url-кодирования</em>для представления в виде компактной строки.</p>
28 <p>Как и заголовок JWT-токена, полезная нагрузка хэшируется с помощью<em>Base64Url-кодирования</em>для представления в виде компактной строки.</p>
28 <p>В нашем примере полезная нагрузка JWT-токена имеет следующее значение:</p>
29 <p>В нашем примере полезная нагрузка JWT-токена имеет следующее значение:</p>
29 <p>Названия некоторых полей могут показаться непонятными с первого взгляда. Например, поле<em>sub</em>означает идентификатор пользователя, а поле<em>iat</em>- время создания токена. При составлении полей полезной нагрузки рекомендуется учитывать имена из документации<a>IANA (Internet Assigned Numbers Authority)</a>. Это поможет избежать конфликтов имен с общепринятыми нормами. Поэтому мы использовали название<em>sub</em>, вместо привычного<em>user_id</em>.</p>
30 <p>Названия некоторых полей могут показаться непонятными с первого взгляда. Например, поле<em>sub</em>означает идентификатор пользователя, а поле<em>iat</em>- время создания токена. При составлении полей полезной нагрузки рекомендуется учитывать имена из документации<a>IANA (Internet Assigned Numbers Authority)</a>. Это поможет избежать конфликтов имен с общепринятыми нормами. Поэтому мы использовали название<em>sub</em>, вместо привычного<em>user_id</em>.</p>
30 <p>Основная причина, почему названия полей в полезной нагрузке JWT-токена пишутся сокращенно, - это уменьшение размера токена после шифрования.</p>
31 <p>Основная причина, почему названия полей в полезной нагрузке JWT-токена пишутся сокращенно, - это уменьшение размера токена после шифрования.</p>
31 <h3>Signature</h3>
32 <h3>Signature</h3>
32 <p>Чтобы создать подпись, мы должны взять закодированный заголовок, закодированную полезную нагрузку, секретную строку и зашифровать эти данные. При этом нужно использовать алгоритм шифрования из заголовка JWT-токена.</p>
33 <p>Чтобы создать подпись, мы должны взять закодированный заголовок, закодированную полезную нагрузку, секретную строку и зашифровать эти данные. При этом нужно использовать алгоритм шифрования из заголовка JWT-токена.</p>
33 <p>В нашем примере для создания подписи используется алгоритм шифрования<em>HMAC SHA256</em>и секретная строка "your-256-bit-secret":</p>
34 <p>В нашем примере для создания подписи используется алгоритм шифрования<em>HMAC SHA256</em>и секретная строка "your-256-bit-secret":</p>
34 <p>Подпись используются, чтобы проверить, что сообщение не было изменено при передаче. Она также позволяет подтвердить, что отправитель JWT-токена является тем, кем он представляется.</p>
35 <p>Подпись используются, чтобы проверить, что сообщение не было изменено при передаче. Она также позволяет подтвердить, что отправитель JWT-токена является тем, кем он представляется.</p>
35 <h3>Собираем все части JWT-токена</h3>
36 <h3>Собираем все части JWT-токена</h3>
36 <p>В результате генерации JWT-токена получаются три Base64-URL-закодированные строки, которые разделены точкой. Значение JWT-токена является компактным и легко передается в HTTP-запросах.</p>
37 <p>В результате генерации JWT-токена получаются три Base64-URL-закодированные строки, которые разделены точкой. Значение JWT-токена является компактным и легко передается в HTTP-запросах.</p>
37 <p>Если вы хотите попрактиковаться с JWT, можно использовать онлайн инструмент<a>jwt.io Debugger</a>для декодирования, проверки и генерации JWT-токенов.</p>
38 <p>Если вы хотите попрактиковаться с JWT, можно использовать онлайн инструмент<a>jwt.io Debugger</a>для декодирования, проверки и генерации JWT-токенов.</p>
38 <p>Мы разобрали, из чего состоит JWT-токен. Теперь рассмотрим алгоритм работы с JWT-токеном в веб-приложениях.</p>
39 <p>Мы разобрали, из чего состоит JWT-токен. Теперь рассмотрим алгоритм работы с JWT-токеном в веб-приложениях.</p>
39 <h3>Алгоритм работы с JWT-токеном</h3>
40 <h3>Алгоритм работы с JWT-токеном</h3>
40 <p>Процесс аутентификации и авторизации с JWT-токеном между веб-браузером и веб-приложением выглядит следующим образом:</p>
41 <p>Процесс аутентификации и авторизации с JWT-токеном между веб-браузером и веб-приложением выглядит следующим образом:</p>
41 <ol><li>Веб-браузер отправляет запрос веб-приложению с логином и паролем</li>
42 <ol><li>Веб-браузер отправляет запрос веб-приложению с логином и паролем</li>
42 <li>Веб-приложение проверяет логин и пароль, и если они верны, то генерирует JWT-токен и отправляет его веб-браузеру. При генерации JWT-токена веб-приложение ставит подпись секретным ключом, который хранится только в веб-приложении</li>
43 <li>Веб-приложение проверяет логин и пароль, и если они верны, то генерирует JWT-токен и отправляет его веб-браузеру. При генерации JWT-токена веб-приложение ставит подпись секретным ключом, который хранится только в веб-приложении</li>
43 <li>Веб-браузер сохраняет JWT-токен и отправляет его вместе с каждым запросом в веб-приложение</li>
44 <li>Веб-браузер сохраняет JWT-токен и отправляет его вместе с каждым запросом в веб-приложение</li>
44 <li>Веб-приложение проверяет JWT-токен и если он верный, то выполняет действие от имени авторизованного пользователя</li>
45 <li>Веб-приложение проверяет JWT-токен и если он верный, то выполняет действие от имени авторизованного пользователя</li>
45 </ol><p>Безопасность коммуникации между веб-браузером и веб-приложением заключается в том, что токены генерируются и подписываются только со стороны веб-приложения. Злоумышленник не сможет подделать токен, так как не знает секретный ключ, который используется для подписи токена.</p>
46 </ol><p>Безопасность коммуникации между веб-браузером и веб-приложением заключается в том, что токены генерируются и подписываются только со стороны веб-приложения. Злоумышленник не сможет подделать токен, так как не знает секретный ключ, который используется для подписи токена.</p>
46 <p>Подпись токена происходит с помощью шифрования. С помощью подписи веб-приложение проверяет, что токен действительно был сгенерирован им. Шифрование может осуществляться различными алгоритмами. Например, алгоритмом HS256 - HMAC с SHA-256.</p>
47 <p>Подпись токена происходит с помощью шифрования. С помощью подписи веб-приложение проверяет, что токен действительно был сгенерирован им. Шифрование может осуществляться различными алгоритмами. Например, алгоритмом HS256 - HMAC с SHA-256.</p>
47 <p>Мы рассмотрели основы JWT-авторизации и поняли, что веб-приложение должно генерировать JWT-токены и подписывать их секретным ключом, который хранится только в веб-приложении. Рассмотрим, как это можно реализовать в Go-приложении.</p>
48 <p>Мы рассмотрели основы JWT-авторизации и поняли, что веб-приложение должно генерировать JWT-токены и подписывать их секретным ключом, который хранится только в веб-приложении. Рассмотрим, как это можно реализовать в Go-приложении.</p>
48 <h2>JWT-авторизация в Go веб-приложении</h2>
49 <h2>JWT-авторизация в Go веб-приложении</h2>
49 <p>Реализуем аутентификацию и авторизацию в социальной сети, которая написана на Go с использованием микрофреймворка Fiber. Для этого реализуем следующие функции:</p>
50 <p>Реализуем аутентификацию и авторизацию в социальной сети, которая написана на Go с использованием микрофреймворка Fiber. Для этого реализуем следующие функции:</p>
50 <ul><li>Регистрация пользователя</li>
51 <ul><li>Регистрация пользователя</li>
51 <li>Вход в аккаунт - аутентификация</li>
52 <li>Вход в аккаунт - аутентификация</li>
52 <li>Получение информации о своем аккаунте - только для авторизованных пользователей</li>
53 <li>Получение информации о своем аккаунте - только для авторизованных пользователей</li>
53 </ul><p>Чтобы упростить работу, мы не будем описывать многие важные части в системах аутентификации пользователей. Например, мы не будем проверять HTTP-запросы, использовать базы данных или хэшировать хранимые пароли для безопасности. Вы можете улучшить эти части веб-приложения самостоятельно.</p>
54 </ul><p>Чтобы упростить работу, мы не будем описывать многие важные части в системах аутентификации пользователей. Например, мы не будем проверять HTTP-запросы, использовать базы данных или хэшировать хранимые пароли для безопасности. Вы можете улучшить эти части веб-приложения самостоятельно.</p>
54 <h3>Регистрация аккаунта</h3>
55 <h3>Регистрация аккаунта</h3>
55 <p>Начнем разработку социальной сети с функции регистрации аккаунта. Когда пользователь заходит на веб-сайт, он видит форму регистрации с тремя полями: имя, электронная почта и пароль. После заполнения формы пользователь нажимает кнопку "Зарегистрироваться", и веб-браузер отправляет HTTP-запрос POST /register в наше веб-приложение. Мы реализуем обработчик этого HTTP-запроса следующим образом:</p>
56 <p>Начнем разработку социальной сети с функции регистрации аккаунта. Когда пользователь заходит на веб-сайт, он видит форму регистрации с тремя полями: имя, электронная почта и пароль. После заполнения формы пользователь нажимает кнопку "Зарегистрироваться", и веб-браузер отправляет HTTP-запрос POST /register в наше веб-приложение. Мы реализуем обработчик этого HTTP-запроса следующим образом:</p>
56 <p>Когда приходит HTTP-запрос на регистрацию нового пользователя, веб-приложение проверяет, что в хранилище еще не существует пользователя с такой электронной почтой. Если пользователь с такой электронной почтой уже есть, то веб-приложение возвращает ошибку. В обратном случае все данные пользователя сохраняются в оперативной памяти веб-приложения.</p>
57 <p>Когда приходит HTTP-запрос на регистрацию нового пользователя, веб-приложение проверяет, что в хранилище еще не существует пользователя с такой электронной почтой. Если пользователь с такой электронной почтой уже есть, то веб-приложение возвращает ошибку. В обратном случае все данные пользователя сохраняются в оперативной памяти веб-приложения.</p>
57 <p>После регистрации пользователь может войти в свой аккаунт, и далее мы реализуем эту возможность.</p>
58 <p>После регистрации пользователь может войти в свой аккаунт, и далее мы реализуем эту возможность.</p>
58 <h3>Вход в аккаунт</h3>
59 <h3>Вход в аккаунт</h3>
59 <p>Когда пользователь заходит на страницу входа в аккаунт, он видит форму с двумя полями: электронная почта и пароль. Эти поля являются учетными данными пользователя. После заполнения формы пользователь нажимает кнопку "Войти", и веб-браузер отправляет HTTP-запрос POST /login в наше веб-приложение. Обработчик этого запроса будет выглядеть следующим образом:</p>
60 <p>Когда пользователь заходит на страницу входа в аккаунт, он видит форму с двумя полями: электронная почта и пароль. Эти поля являются учетными данными пользователя. После заполнения формы пользователь нажимает кнопку "Войти", и веб-браузер отправляет HTTP-запрос POST /login в наше веб-приложение. Обработчик этого запроса будет выглядеть следующим образом:</p>
60 <p>Когда приходит HTTP-запрос на вход в аккаунт, веб-приложение проверяет, что в хранилище существует пользователь с такой электронной почтой и паролем. Если учетные данные некорректны, то веб-приложение возвращает ошибку. В обратном случае пользователь успешно прошел аутентификацию, и веб-приложение генерирует и возвращает JWT-токен. Его пользователь будет использовать в будущих HTTP-запросах, чтобы авторизоваться.</p>
61 <p>Когда приходит HTTP-запрос на вход в аккаунт, веб-приложение проверяет, что в хранилище существует пользователь с такой электронной почтой и паролем. Если учетные данные некорректны, то веб-приложение возвращает ошибку. В обратном случае пользователь успешно прошел аутентификацию, и веб-приложение генерирует и возвращает JWT-токен. Его пользователь будет использовать в будущих HTTP-запросах, чтобы авторизоваться.</p>
61 <p>Чтобы сгенерировать JWT-токен, мы используем библиотеку<a>jwt-go</a>. Благодаря этому все тонкости формирования и шифрования токена скрыты от нас. Все, что от нас требуется, - это указать секретный ключ для подписи токена и полезные данные, которые будут храниться в токене.</p>
62 <p>Чтобы сгенерировать JWT-токен, мы используем библиотеку<a>jwt-go</a>. Благодаря этому все тонкости формирования и шифрования токена скрыты от нас. Все, что от нас требуется, - это указать секретный ключ для подписи токена и полезные данные, которые будут храниться в токене.</p>
62 <p>В полезных данных JWT-токена мы записываем электронную почту пользователя как идентификатор. Также записываем время, когда этот токен будет недействителен. В нашем примере время жизни JWT-токена составляет 72 часа. Когда это время истечет, пользователь должен будет войти в аккаунт заново.</p>
63 <p>В полезных данных JWT-токена мы записываем электронную почту пользователя как идентификатор. Также записываем время, когда этот токен будет недействителен. В нашем примере время жизни JWT-токена составляет 72 часа. Когда это время истечет, пользователь должен будет войти в аккаунт заново.</p>
63 <p>Теперь в нашей социальной сети пользователи могут регистрироваться и аутентифицироваться - входить в свои аккаунты. Далее реализуем функцию получения информации о своем аккаунте, которая будет доступна только авторизованным пользователям.</p>
64 <p>Теперь в нашей социальной сети пользователи могут регистрироваться и аутентифицироваться - входить в свои аккаунты. Далее реализуем функцию получения информации о своем аккаунте, которая будет доступна только авторизованным пользователям.</p>
64 <h3>Получение информации о своем аккаунте для авторизованных пользователей</h3>
65 <h3>Получение информации о своем аккаунте для авторизованных пользователей</h3>
65 <p>Когда пользователь прошел аутентификацию, он получил JWT-токен, который будет использовать в последующих HTTP-запросах для авторизации. Есть разные способы передавать токен в HTTP-запросе. Для этого можно использовать заголовок<em>Authorization</em>, параметр запроса или даже куки веб-браузера. Мы будем использовать заголовок<em>Authorization</em>, так как это наиболее распространенный способ передачи JWT-токена в HTTP-запросе.</p>
66 <p>Когда пользователь прошел аутентификацию, он получил JWT-токен, который будет использовать в последующих HTTP-запросах для авторизации. Есть разные способы передавать токен в HTTP-запросе. Для этого можно использовать заголовок<em>Authorization</em>, параметр запроса или даже куки веб-браузера. Мы будем использовать заголовок<em>Authorization</em>, так как это наиболее распространенный способ передачи JWT-токена в HTTP-запросе.</p>
66 <p>Когда пользователь заходит на свою страницу, веб-браузер отправляет HTTP-запрос GET /profile в наше веб-приложение. Обработчик этого запроса выглядит следующим образом:</p>
67 <p>Когда пользователь заходит на свою страницу, веб-браузер отправляет HTTP-запрос GET /profile в наше веб-приложение. Обработчик этого запроса выглядит следующим образом:</p>
67 <p>Так как проверка авторизации может происходить во многих HTTP-обработчиках, мы вынесли ее на уровень посредников. В микрофреймворке Fiber для этого есть готовый посредник -<a>jwtware</a>.</p>
68 <p>Так как проверка авторизации может происходить во многих HTTP-обработчиках, мы вынесли ее на уровень посредников. В микрофреймворке Fiber для этого есть готовый посредник -<a>jwtware</a>.</p>
68 <p>При инициализации посредника мы указали два свойства:</p>
69 <p>При инициализации посредника мы указали два свойства:</p>
69 <ul><li><em>SigningKey</em>- секретный ключ JWT-токена</li>
70 <ul><li><em>SigningKey</em>- секретный ключ JWT-токена</li>
70 <li><em>ContextKey</em>- название поля, по которому хранится объект JWT-токена авторизованного пользователя. Этот объект можно использовать в любом обработчике группы authorizedGroup</li>
71 <li><em>ContextKey</em>- название поля, по которому хранится объект JWT-токена авторизованного пользователя. Этот объект можно использовать в любом обработчике группы authorizedGroup</li>
71 </ul><p>Когда приходит HTTP-запрос на получение информации о пользователе, веб-приложение проверяет, что в заголовке<em>Authorization</em>указан корректный JWT-токен. Если проверка прошла успешно, веб-приложение ищет пользователя в хранилище по электронной почте, которая записана в полезной нагрузке JWT-токена. Если пользователь был найден, то авторизация пройдена, и мы возвращаем в HTTP-ответе информацию об этом пользователе.</p>
72 </ul><p>Когда приходит HTTP-запрос на получение информации о пользователе, веб-приложение проверяет, что в заголовке<em>Authorization</em>указан корректный JWT-токен. Если проверка прошла успешно, веб-приложение ищет пользователя в хранилище по электронной почте, которая записана в полезной нагрузке JWT-токена. Если пользователь был найден, то авторизация пройдена, и мы возвращаем в HTTP-ответе информацию об этом пользователе.</p>
72 <p>Мы реализовали все части аутентификации и авторизации нашей социальной сети. Теперь соберем все вместе и проверим, что веб-приложение работает.</p>
73 <p>Мы реализовали все части аутентификации и авторизации нашей социальной сети. Теперь соберем все вместе и проверим, что веб-приложение работает.</p>
73 <h3>Проверяем веб-приложение</h3>
74 <h3>Проверяем веб-приложение</h3>
74 <p>Полный код веб-приложения выглядит следующим образом:</p>
75 <p>Полный код веб-приложения выглядит следующим образом:</p>
75 <p>Запускаем веб-приложение и отправляем запрос на регистрацию нового пользователя:</p>
76 <p>Запускаем веб-приложение и отправляем запрос на регистрацию нового пользователя:</p>
76 <p>В ответ получаем:</p>
77 <p>В ответ получаем:</p>
77 <p>Это означает, что такого пользователя нет в хранилище, и он был успешно создан.</p>
78 <p>Это означает, что такого пользователя нет в хранилище, и он был успешно создан.</p>
78 <p>Теперь попробуем пройти аутентификацию этого пользователя:</p>
79 <p>Теперь попробуем пройти аутентификацию этого пользователя:</p>
79 <p>В ответ приходит:</p>
80 <p>В ответ приходит:</p>
80 <p>Мы указали корректные учетные данные пользователя, поэтому аутентификация прошла успешно. В ответ веб-приложение вернуло JWT-токен, который мы будем использовать для авторизации при получении информации о пользователе.</p>
81 <p>Мы указали корректные учетные данные пользователя, поэтому аутентификация прошла успешно. В ответ веб-приложение вернуло JWT-токен, который мы будем использовать для авторизации при получении информации о пользователе.</p>
81 <p>Отправляем запрос на получение информации о пользователе:</p>
82 <p>Отправляем запрос на получение информации о пользователе:</p>
82 <p>В ответ приходит:</p>
83 <p>В ответ приходит:</p>
83 <p>Так как мы передали JWT-токен в заголовке HTTP-запроса<em>Authorization</em>, веб-приложение авторизовало нас как пользователя<em><a>john@doe.com</a></em>, и вернуло информацию о нашем аккаунте.</p>
84 <p>Так как мы передали JWT-токен в заголовке HTTP-запроса<em>Authorization</em>, веб-приложение авторизовало нас как пользователя<em><a>john@doe.com</a></em>, и вернуло информацию о нашем аккаунте.</p>
84 <p>В последнем запросе есть один интересный момент. Мы поставили перед значением токена слово<em>Bearer</em>:</p>
85 <p>В последнем запросе есть один интересный момент. Мы поставили перед значением токена слово<em>Bearer</em>:</p>
85 <p><strong>Bearer</strong>переводится как носитель. Он дает веб-приложению понять, что в заголовке<em>Authorization</em>передан токен для авторизации. Принято считать, что это слово означает фразу: "Дай доступ к носителю этого токена". Если не указать слово<em>Bearer</em>перед значением, то авторизация не пройдет даже с корректным значением токена.</p>
86 <p><strong>Bearer</strong>переводится как носитель. Он дает веб-приложению понять, что в заголовке<em>Authorization</em>передан токен для авторизации. Принято считать, что это слово означает фразу: "Дай доступ к носителю этого токена". Если не указать слово<em>Bearer</em>перед значением, то авторизация не пройдет даже с корректным значением токена.</p>
86 <p>Мы реализовали функцию регистрации, аутентификации и получение информации об аккаунте авторизованного пользователя. Для авторизации мы использовали JWT-токен, который генерируются при входе в аккаунт на 72 часа и передается в заголовке HTTP-запроса<em>Authorization</em>.</p>
87 <p>Мы реализовали функцию регистрации, аутентификации и получение информации об аккаунте авторизованного пользователя. Для авторизации мы использовали JWT-токен, который генерируются при входе в аккаунт на 72 часа и передается в заголовке HTTP-запроса<em>Authorization</em>.</p>
87 <h2>Выводы</h2>
88 <h2>Выводы</h2>
88 <ul><li>Аутентификация - это процесс проверки подлинности пользователя, который пытается получить доступ к веб-приложению</li>
89 <ul><li>Аутентификация - это процесс проверки подлинности пользователя, который пытается получить доступ к веб-приложению</li>
89 <li>Авторизация - это процесс проверки прав пользователя на какое-либо действие в веб-приложении</li>
90 <li>Авторизация - это процесс проверки прав пользователя на какое-либо действие в веб-приложении</li>
90 <li>Один из способов реализации системы авторизации - это JWT-токен. Токен генерируется и подписывается веб-приложением после успешной аутентификации и передается во всех последующих HTTP-запросах в заголовке<em>Authorization</em></li>
91 <li>Один из способов реализации системы авторизации - это JWT-токен. Токен генерируется и подписывается веб-приложением после успешной аутентификации и передается во всех последующих HTTP-запросах в заголовке<em>Authorization</em></li>
91 <li>JWT-токен содержит информацию о пользователе и подпись, которая необходима для авторизации. Так как токен подписан секретным ключом в веб-приложении, то его может проверять на подлинность только это веб-приложение.</li>
92 <li>JWT-токен содержит информацию о пользователе и подпись, которая необходима для авторизации. Так как токен подписан секретным ключом в веб-приложении, то его может проверять на подлинность только это веб-приложение.</li>
92 </ul>
93 </ul>