<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927346</guid>
        <pubDate>Fri, 22 Aug 2025 20:38:52 +0000</pubDate>
        <title>Базовые вопросы по процедуре регистрации в веб-приложениях</title>
        <link>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927346</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927341'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-22T18:16:39+00:00">22.08.25, 18:16</time></span><div class='quote '>1. Зачем нужен Header (заголовок). Кем и как он используется?</div></div><br>
Он используется алгоритмом обратной верификации. Когда нужно извлечь данные из токена и проверить их подлинность. Тогда не придется прибегать к лишним запросам БД и проверять наличие данных в ней. Хотя это и не исключается.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">const jwt = require(&quot;jsonwebtoken&quot;);</div><div class="code_line">const tok = jwt.sign({ test: &quot;string&quot; }, &quot;abracadabra&quot;, { expiresIn: &#39;1h&#39; });</div><div class="code_line">const parts = tok.split(&#39;.&#39;);</div><div class="code_line">console.log(tok, &#39;\n&#39;, parts.map((part, index) =&#62; index &#60; 2 ? atob(part) : part));</div><div class="code_line">&nbsp;</div><div class="code_line">// Проверка и извлечение данных из токена.</div><div class="code_line">// В отличии от 3-ей строки этого примера последующая проверяет</div><div class="code_line">// 2-ю часть на целостность используя данные из 1-ой части и сравнивая результат с 3-ей частью.</div><div class="code_line">// Так же происходит проверка на истечение срока действия токена, если присутствует значение exp в payload.</div><div class="code_line">// Функция &#60;(e, d) =&#62; e ? null : d&#62; в 3-ем параметре следующей строки позволяет избавиться от блока &#60;try {} catch() {}&#62; и обработать ошибки верификации.</div><div class="code_line">const payload = jwt.verify(tok, &quot;abracadabra&quot;, (e, d) =&#62; e ? null : d);</div><div class="code_line">console.log(payload);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">$ node index.js</div><div class="code_line">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXN0Ijoic3RyaW5nIiwiaWF0IjoxNzU1NDU4OTU1LCJleHAiOjE3NTU0NjI1NTV9.2LI59SiCcVI_wsgyyJgQLk7GgU-kL2LANFDixXF-OHs</div><div class="code_line">&nbsp;[</div><div class="code_line">&nbsp;&nbsp;&#39;{&quot;alg&quot;:&quot;HS256&quot;,&quot;typ&quot;:&quot;JWT&quot;}&#39;,</div><div class="code_line">&nbsp;&nbsp;&#39;{&quot;test&quot;:&quot;string&quot;,&quot;iat&quot;:1755458955,&quot;exp&quot;:1755462555}&#39;,</div><div class="code_line">&nbsp;&nbsp;&#39;2LI59SiCcVI_wsgyyJgQLk7GgU-kL2LANFDixXF-OHs&#39;</div><div class="code_line">]</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;test: &quot;string&quot;,</div><div class="code_line">&nbsp;&nbsp;iat: 1755458955,</div><div class="code_line">&nbsp;&nbsp;exp: 1755462555</div><div class="code_line">}</div></ol></div></div></div></div>Теперь в вывод добавился payload из sign, но с двумя дополнительными полями, которые отвечают за срок действия токена.<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body">Не пинайте, за то, что я это просто взял из примера выше, а не прогнал в программе т.к. таймстемпы сдают меня с потрохами.</div></div><br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927341'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-22T18:16:39+00:00">22.08.25, 18:16</time></span><div class='quote '>2. Для чего в токен вкладывают Payload (полезная нагрузка). Где и как это используется? Можете написать примеры сценариев?</div></div><br>
Это могут быть любые ваши данные, которые пользователь предоставил вам, но они должны храниться у него и без изменения.<br>
Вываливая эти данные на email и запихивая их в ссылку вы передаете персональную информацию пользователя третьей стороне.<br>
<br>
Вот сценарий: Пользователь входит в вашу систему (проходит верификацию, предоставляя логин и пароль). Вы получаете его верификационные данные и находите заданную пару в таблице пользователей. После этого у вас есть не только логин и пароль, но и другие связанные с пользователем личные данные, указанные при регистрации. Не найдя все эти данные пользователю сообщается, что он не авторизован и надо бы зарегистрироваться.<br>
  При успешном поиске в таблице пользователей обычно хранится: Имя, фамилия, дата рождения, город, ключи от квартиры где деньги лежат ;), но главное есть индекс uid, который используется для связи данных с пользователем в других таблицах БД. Вот этот uid можно воткнуть в payload к токену без опасения. А он будет указывать вам на строку в таблице с логином, который будет представляться из себя email. Можно воткнуть еще и имя с фамилией и датой рождения, но тогда токен нельзя будет передавать в ссылках уже точно не нарушая при этом закон о персональных данных. По сути вы тем самым в открытую передаете эти данные 3-им лицам.<br>
  После успешной авторизации таким способом вам надо для пользователя открыть новую сессию (создать новый токен и записать его в таблицу токенов вместе с uid пользователя). Таким образом вы зафиксирует факт входа в систему этим пользователем с некоторого устройства. ip и user-agent из заголовков тоже могут быть записаны в эту таблицу, чтобы этим токеном нельзя было пользоваться с другого устройства этого же пользователя. Далее созданные токен устанавливается в заголовке Set-Cookie ответа на запрос входа и далее он будет храниться как у вас в БД (но вам уже достаточно хранить только 3-ю часть) так же и на компьютере пользователя. У вас же будет зафиксировано это устройство через его ip и User-Agent.<br>
  Тогда, закрыв и снова открыв страницу, вы получите в cookie ваш токен и сможете возобновить сессию. Но вот я все же предпочитаю этот токен из cookie копировать в заголовок Authorization в первом запросе к backend с возобновлением старой сессии чтобы гарантировать, что фронтенд переключился и работает в режиме авторизованного пользователя.<br>
  Еще может возникнуть две ситуации. Первая: страница пользователя все еще открыта и работает, но токен истек. Тогда нужен механизм повторной авторизации на сервере без запроса данных у пользователя. Вторая: страница снова открыта, а токен из cookie уже истек. Второе обычно решается путем установки срока действия cookie равного (или на секунду меньшего) сроку действия токена. Тогда пользователя можно и повторно спросить о регистрационных данных, если не предусмотреть механизма продления действия такой сессии. Хотя лучше так не делать.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927341'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-22T18:16:39+00:00">22.08.25, 18:16</time></span><div class='quote '>3. Signature (подпись). Эта часть как раз делает токен уникальным ключом? Но не пойму зачем гарантировать подлинность header и payload.</div></div><br>
Так организуется механизм распределенного хранения данных на пользовательских компьютерах. Подлинность прежде всего <span class='tag-u'>говорит вам</span>, что этому токену можно верить.<br>
Но&#33; Раскодировав header и payload из токена <strong class='tag-b'>редиски</strong> могут попытаться подобрать пароль (&quot;abracadabra&quot;) и создать свой токен. Поэтому часть данных (3-ю) из него нужно хранить у себя, чтобы точно знать что этот токен создан вами. Т.к. в токен входит поле iat то третья часть будет всегда разной даже для двух токенов с одним payload созданных в разное время.<br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2025-08-22T23:59:18+03:00">22.08.25, 20:59</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927341'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-22T18:16:39+00:00">22.08.25, 18:16</time></span><div class='quote '>а. Токены хранятся в таблице БД?</div></div><br>
Можно хранить как полностью так и частично (только контрольную сумму из 3-ей части). Надо понимать, что сохраняя первые две части токена в БД вы будете забивать её избыточной (уже присутствующей в БД - payload) или константной информацией (header).<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927341'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-22T18:16:39+00:00">22.08.25, 18:16</time></span><div class='quote '>б. В одной таблице хранятся и рефреш и акцесс токены?</div></div><br>
Это два разных механизма, но сами токены идентичны. Если снабдите таблицу полем для различия этих типов токенов, тогда можно хранить и в одной таблице. Но лучше в разных.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927341'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-22T18:16:39+00:00">22.08.25, 18:16</time></span><div class='quote '>в. Токены хранятся в Редис или обычной Постгресс?</div></div><br>
Храните их хоть в текстовом файле. Важно не где а для чего. Вам надо хранить их у себя, хотя бы частично, чтобы иметь возможность отличить собственный токен от сгенерированного третьими лицами. Да хоть предыдущими, не совместимыми с текущей, версиями этого же проекта.]]></description>
        <author>macomics</author>
        <category>PHP</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927341</guid>
        <pubDate>Fri, 22 Aug 2025 18:16:39 +0000</pubDate>
        <title>Базовые вопросы по процедуре регистрации в веб-приложениях</title>
        <link>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927341</link>
        <description><![CDATA[rownong@yandex.ru: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927006'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T19:20:58+00:00">17.08.25, 19:20</time></span><div class='quote '>Вот я создал токен. Вывел его в консоль и прогнал тот мой код. Его результатом стал вот такой массив. Как можете видеть - jsonwebtoken состоит из 3-х часте.<br>
В первой части js объект в формате json кодированный в base64. Он описывает алгоритм шифрования и тип.<br>
Во второй части тот объект, что я передал для генерации токена, но дополненный полями с временной меткой в секундах и временной меткой с временем истечения действия токена.<br>
Ну а третью чать я не декодировал через base64 т.к. только она и является зашифрованный. Части соединяются в одну строку через разделитель (точку).</div></div><br>
Да, теперь я увидел 3 части токена<br>
header.payload.signature <br>
Спасибо&#33;<br>
<br>
Погуглил:<br>
1. Header (заголовок) — метаданные токена: алгоритм подписи и тип.<br>
2. Payload (полезная нагрузка) — утверждения (claims): данные о пользователе и сроке действия.<br>
3. Signature (подпись) — криптографическая подпись, гарантирует целостность и подлинность header и payload.<br>
<br>
Уточните:<br>
1. Зачем нужен Header (заголовок). Кем и как он используется? <br>
2. Для чего в токен вкладывают Payload (полезная нагрузка). Где и как это используется? Можете написать примеры сценариев?<br>
3. Signature (подпись). Эта часть как раз делает токен уникальным ключом? Но не пойму зачем гарантировать подлинность header и payload.<br>
<br>
И еще подскажите:<br>
а. Токены хранятся в таблице БД?<br>
б. В одной таблице хранятся и рефреш и акцесс токены?<br>
в. Токены хранятся в Редис или обычной Постгресс?]]></description>
        <author>rownong@yandex.ru</author>
        <category>PHP</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927006</guid>
        <pubDate>Sun, 17 Aug 2025 19:20:58 +0000</pubDate>
        <title>Базовые вопросы по процедуре регистрации в веб-приложениях</title>
        <link>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927006</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927005'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T18:57:03+00:00">17.08.25, 18:57</time></span><div class='quote '>Несколько запутался. Что такое &quot;3-часть токена&quot;?</div></div><br>
Посмотрите что вам напечатает мой код из <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=465179&hl=#' target='_blank'>#2</a> (Код на JavaScript)<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927005'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T18:57:03+00:00">17.08.25, 18:57</time></span><div class='quote '>1. Соль - это случайная строка которая возникает в момент генерации хеша?<br>
2. Строка для каждого пароля всегда случайная.<br>
3. Генерация соли (случайной строки) на стороне компонента создания хеша и как таковая соль специально отдельной строкой нигде не фиксируется?<br>
4. Т.е. соль для каждого пароля - никому не известна (не создателю системы и не кому другому)?</div></div><br>
1. Да. Возможно что не строка, а число (зависит от алгоритма). Но главное что случайное.<br>
2. Да.<br>
3. Фиксируется в хеше пароля. т.е. дополнительно её сохранять нет смысла (даже вредно).<br>
4. Не известна (не должна быть известна). <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2025-08-17T19:34:20+00:00">17.08.25, 19:34</time></span></span><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">$ cat index.js</div><div class="code_line">const jwt = require(&quot;jsonwebtoken&quot;);</div><div class="code_line">const tok = jwt.sign({ test: &quot;string&quot; }, &quot;abracadabra&quot;, { expiresIn: &#39;1h&#39; });</div><div class="code_line">const parts = tok.split(&#39;.&#39;);</div><div class="code_line">console.log(tok, &#39;\n&#39;, parts.map((part, index) =&#62; index &#60; 2 ? atob(part) : part));</div><div class="code_line">&nbsp;</div><div class="code_line">$ node index.js</div><div class="code_line">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXN0Ijoic3RyaW5nIiwiaWF0IjoxNzU1NDU4OTU1LCJleHAiOjE3NTU0NjI1NTV9.2LI59SiCcVI_wsgyyJgQLk7GgU-kL2LANFDixXF-OHs </div><div class="code_line">&nbsp;[</div><div class="code_line">&nbsp;&nbsp;&#39;{&quot;alg&quot;:&quot;HS256&quot;,&quot;typ&quot;:&quot;JWT&quot;}&#39;,</div><div class="code_line">&nbsp;&nbsp;&#39;{&quot;test&quot;:&quot;string&quot;,&quot;iat&quot;:1755458955,&quot;exp&quot;:1755462555}&#39;,</div><div class="code_line">&nbsp;&nbsp;&#39;2LI59SiCcVI_wsgyyJgQLk7GgU-kL2LANFDixXF-OHs&#39;</div><div class="code_line">]</div></ol></div></div></div></div><br>
Вот я создал токен. Вывел его в консоль и прогнал тот мой код. Его результатом стал вот такой массив. Как можете видеть - jsonwebtoken состоит из 3-х часте.<br>
В первой части js объект в формате json кодированный в base64. Он описывает алгоритм шифрования и тип.<br>
Во второй части тот объект, что я передал для генерации токена, но дополненный полями с временной меткой в секундах и временной меткой с временем истечения действия токена.<br>
Ну а третью чать я не декодировал через base64 т.к. только она и является зашифрованный. Части соединяются в одну строку через разделитель (точку).]]></description>
        <author>macomics</author>
        <category>PHP</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927005</guid>
        <pubDate>Sun, 17 Aug 2025 18:57:03 +0000</pubDate>
        <title>Базовые вопросы по процедуре регистрации в веб-приложениях</title>
        <link>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927005</link>
        <description><![CDATA[rownong@yandex.ru: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927002'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T14:28:02+00:00">17.08.25, 14:28</time></span><div class='quote '>Можно и токен, только не весь. Только 3-ю его часть</div></div><br>
Несколько запутался. Что такое &quot;3-часть токена&quot;? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2025-08-17T18:59:25+00:00">17.08.25, 18:59</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927002'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T14:28:02+00:00">17.08.25, 14:28</time></span><div class='quote '>Нет. Она создается во время хеширования пароля и более ни где не хранится.<br>
</div></div><br>
Я правильно понял, что:<br>
1. Соль - это случайная строка которая возникает в момент генерации хеша?<br>
2. Строка для каждого пароля всегда случайная.<br>
3. Генерация соли (случайной строки) на стороне компонента создания хеша и как таковая соль специально отдельной строкой нигде не фиксируется? <br>
4. Т.е. соль для каждого пароля - никому не известна (не создателю системы и не кому другому)?]]></description>
        <author>rownong@yandex.ru</author>
        <category>PHP</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927002</guid>
        <pubDate>Sun, 17 Aug 2025 14:28:02 +0000</pubDate>
        <title>Базовые вопросы по процедуре регистрации в веб-приложениях</title>
        <link>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927002</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927001'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T13:42:35+00:00">17.08.25, 13:42</time></span><div class='quote '>А где соль (какое-то слово) физически хранится? В файле с кодом &quot;file.php&quot; который отвечает за добавление соли?</div></div><br>
Нет. Она создается во время хеширования пароля и более ни где не хранится.<br>
<br>
Если рассмотреть применение соли в PostgreSQL тогда вы увидите следующее<br>
<a class='tag-url' href='https://postgrespro.ru/docs/postgresql/17/pgcrypto#PGCRYPTO-PASSWORD-HASHING-FUNCS-CRYPT' target='_blank'>https://postgrespro.ru/docs/postgresql/17/p...ING-FUNCS-CRYPT</a><br>
<br>
Вот как раз в том примере <strong class='tag-b'>entered password</strong> это уже повторно введенный пользователем пароль для логина, а вот pswhash - это сохраненный в базе хэш пароля. Как видите после update соль не нужна для проверки совпадения паролей.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927001'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T13:42:35+00:00">17.08.25, 13:42</time></span><div class='quote '>А что тогда в ссылку для подтверждения помещается?</div></div><br>
Можно и токен, только не весь. Только 3-ю его часть]]></description>
        <author>macomics</author>
        <category>PHP</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927001</guid>
        <pubDate>Sun, 17 Aug 2025 13:42:35 +0000</pubDate>
        <title>Базовые вопросы по процедуре регистрации в веб-приложениях</title>
        <link>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927001</link>
        <description><![CDATA[rownong@yandex.ru: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927000'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T12:15:29+00:00">17.08.25, 12:15</time></span><div class='quote '>Это не нужно хранить в БД. Оно нужно только для создания защищенного хэша пароля. Если его сохранить, тогда (наверное) станет возможно прочитать пароль.</div></div><br>
А где соль (какое-то слово) физически хранится? В файле с кодом &quot;file.php&quot; который отвечает за добавление соли? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2025-08-17T13:43:37+00:00">17.08.25, 13:43</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3927000'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T12:15:29+00:00">17.08.25, 12:15</time></span><div class='quote '>Их лучше не использовать в URL ссылках. Они не очень защищенные.</div></div><br>
А что тогда в ссылку для подтверждения помещается?]]></description>
        <author>rownong@yandex.ru</author>
        <category>PHP</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927000</guid>
        <pubDate>Sun, 17 Aug 2025 12:15:29 +0000</pubDate>
        <title>Базовые вопросы по процедуре регистрации в веб-приложениях</title>
        <link>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3927000</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3926998'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T08:21:46+00:00">17.08.25, 08:21</time></span><div class='quote '>- JWT-токен (зашифрованы емейл и имя пользователя)</div></div><br>
Это лучше хранить отдельно. Они генерируются для каждого входа с разных устройств для пользователя и их может быть больше одного для каждого пользователя. По сути jwt стоит генерировать для такой сущности как сессия, а не пользователь.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3926998'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T08:21:46+00:00">17.08.25, 08:21</time></span><div class='quote '>- соль для пароля</div></div><br>
Это не нужно хранить в БД. Оно нужно только для создания защищенного хэша пароля. Если его сохранить, тогда (наверное) станет возможно прочитать пароль.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3926998'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T08:21:46+00:00">17.08.25, 08:21</time></span><div class='quote '>б. Отправляется письмо на указанный емейл. В письме ссылка JWT-токен</div></div><br>
Их лучше не использовать в URL ссылках. Они не очень защищенные.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">const jwtok=&quot;YOUR JWToken&quot;;</div><div class="code_line">const parts = jwtok.split(&#39;.&#39;);</div><div class="code_line">console.log(parts.map((part, index) =&#62; index &#60; 2 ? atob(part) : part));</div></ol></div></div></div></div><br>
Попробуйте код выше для вашего токена.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=465179&view=findpost&p=3926998'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>rownong@yandex.ru &#064; <time class="tag-quote__quoted-time" datetime="2025-08-17T08:21:46+00:00">17.08.25, 08:21</time></span><div class='quote '>4. Пользователь переходит по ссылке из письма.<br>
Отправляется запроса к API методу 2, который в параметре принимает JWT-токен.<br>
Происходит активация пользователя.<br>
Отправляет письмо об успешно активации</div></div><br>
Детализируем (прямые ссылки на backend лучше не генерировать):<br>
Ссылка ведет на фронтенд, который загружается и показывает сообщение о успешном подтверждении.<br>
Одновременно он активирует backend метод, который может отправить письмо об успешной активации пользователю на почту.]]></description>
        <author>macomics</author>
        <category>PHP</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3926998</guid>
        <pubDate>Sun, 17 Aug 2025 08:21:46 +0000</pubDate>
        <title>Базовые вопросы по процедуре регистрации в веб-приложениях</title>
        <link>https://forum.sources.ru/index.php?showtopic=465179&amp;view=findpost&amp;p=3926998</link>
        <description><![CDATA[rownong@yandex.ru: Здравствуйте.<br>
Хочу разобраться как устроена регистрация в веб-приложениях.<br>
Составил простой сценарий как я его понимаю.<br>
Если есть замечания, прошу написать или переписать сценарий как считаете верным.<br>
<br>
<strong class='tag-b'>Шаги регистрации и API методы:</strong><br>
1. Заполняется форма на странице емейл, пароль и отправляется на сервер.<br>
Происходит обращение у API методу 1, который в параметрах принимает: емейл, пароль.<br>
<br>
2. Проверки<br>
- валидный емейл и пароль<br>
- емейла еще нет в системе<br>
Не успех: ответ об ошибке.<br>
Успех: сообщение о письме-активации отправленном на емейл.<br>
<br>
3. При успехе <br>
а. В БД в таблицу users добалуется пользователь. Заполнится столбцы<br>
- uuid пользователя<br>
- имя<br>
- емейл<br>
- JWT-токен (зашифрованы емейл и имя пользователя)<br>
- соль для пароля<br>
- хеш пароля<br>
- статус (не активирован / активирован)<br>
б. Отправляется письмо на указанный емейл. В письме ссылка JWT-токен<br>
<br>
4. Пользователь переходит по ссылке из письма.<br>
Отправляется запроса к API методу 2, который в параметре принимает JWT-токен. <br>
Происходит активация пользователя.<br>
Отправляет письмо об успешно активации<br>
<br>
Не успех: JWT-токен не верный / уже активирован.<br>
Успех: статус пользователя в БД =&gt; активирован.<br>
Дополнительно:<br>
При переходе по ссылке в письма<br>
- бэкенд ставит куку с JWT-токеном в браузер пользователя<br>
- бэкенд проверяет куку в браузер пользователя<br>
- если JWT-токен актуален – пользователя пускает в кабинет.]]></description>
        <author>rownong@yandex.ru</author>
        <category>PHP</category>
      </item>
	
      </channel>
      </rss>
	