Перейти к содержанию

Ссылки для входа

Большинство людей, которые пишут в службу поддержки, не хотят заводить пароль. Helpdesk Pro входит за клиента по ссылке, которую отправляет ему письмом: человек вводит адрес, открывает письмо, нажимает — и видит свои обращения. Ссылка в каждом письме клиенту работает так же, поэтому гость, отправивший форму, нажимает «View or reply to your request» и попадает на это обращение уже с выполненным входом.

Это собственные ссылки Helpdesk Pro, а не magic link плагина Login. Ссылке плагина Login нужна существующая учётная запись Grav, а у большинства людей, которые обращаются в поддержку, её ещё нет. Helpdesk Pro создаёт учётную запись при первом использовании ссылки.

Страницы

Маршрут Что делает
GET {mount}/login Одно поле электронной почты и кнопка Email me a link. Люди с паролем также получают ссылку на страницу плагина Login. ?return= задаёт страницу портала, на которую нужно вернуться. Уже вошедшего человека отправляют туда или на «Your requests».
POST {mount}/login Запрашивает ссылку. Всегда отвечает одной и той же страницей «Check your email», каким бы ни был адрес.
GET {mount}/login/verify?token= Страница, которую открывает ссылка. Она называет адрес и рисует одну кнопку, ничего не расходуя.
POST {mount}/login/verify Эта кнопка: использует ссылку, выполняет вход и открывает то, на что указывала ссылка.
POST {mount}/login/verify-email Вошедший клиент запрашивает ссылку, подтверждающую адрес его учётной записи.
GET {mount}/new/thanks Куда попадает гость после отправки формы: «Check your email».

Каждому POST нужен nonce портала helpdesk-portal, как и любой другой форме портала.

Страница всегда говорит «If that address has requests with us, we've sent it a link to sign in» и выглядит одинаково для любого адреса. За этим:

  • Адрес, известный Helpdesk Pro и принадлежащий активному клиенту, получает письмо client-magic-link.
  • Неизвестный адрес не получает ничего. Заблокированный или удалённый человек тоже, как и любой сотрудник: ссылка из письма никогда не должна открывать сессию сотрудника.
  • Запрос ограничен по частоте: 10 запросов с одного IP-адреса в час и 5 на адрес (и на человека) в час. После лимита страница выглядит так же, и ничего не отправляется.

Письмо отправляется заданием magic_link.send сразу после ответа страницы или при следующем запуске фонового процесса. Ссылка создаётся во время сборки письма и никогда нигде не записывается.

  • Это 32 случайных байта, записанных как 43 безопасных для URL символа. Хранится только их SHA-256, поэтому копия базы данных никого не сможет авторизовать.
  • Она работает один раз. Два одновременных нажатия не могут использовать её оба.
  • Она перестаёт действовать при использовании, когда человек запрашивает другую (новая ссылка завершает все его неиспользованные), или когда меняется пароль его учётной записи Grav.
  • Ссылка, запрошенная человеком, действует portal.magic_link_minutes (30). Ссылка в письме клиенту действует portal.email_link_days (7).
  • Использованная, истёкшая, заменённая или неизвестная ссылка приводит на страницу входа с текстом «That link has expired or was already used. We can send a new one.» Если она пришла из письма клиенту, адрес уже заполнен. Во всех случаях показывается одна и та же фраза, поэтому страница никогда не сообщает проверяющему, какой именно случай произошёл.
  • Ссылки удаляются через день после истечения или использования.

Нажатие на ссылку открывает небольшую страницу («Sign in to see your request», «Sign in» или «Confirm your email address») с адресом, которому принадлежит ссылка, и одной кнопкой. На этом этапе ничего не расходуется. Кнопка отправляет POST, и именно POST выполняет вход.

Корпоративные почтовые сканеры и предпросмотрщики ссылок открывают каждую ссылку в ящике до того, как её увидит получатель. Ссылка, которая выполняла бы вход по GET, была бы израсходована до того, как клиент на неё нажмёт. Это правило действует для каждой ссылки, которую Helpdesk Pro отправляет по почте.

Посетитель, уже вошедший как этот человек с подтверждённым адресом, сразу попадает туда, куда указывает ссылка. Страница, открытая так долго, что её nonce истёк, перерисовывается с текстом «Your page was open for a long time»; ссылка при этом всё ещё не использована.

Кнопка (POST {mount}/login/verify) использует ссылку, после чего:

  1. Адрес человека считается подтверждённым.
  2. Его учётная запись Grav находится или создаётся, если её нет: имя пользователя — адрес электронной почты, если Grav его принимает и он свободен, иначе часть до @ с числом; без пароля; access.site.login. Ничего введённое посетителем в неё не попадает, поэтому никто не может таким способом выдать себе группы или права. Затем учётной записи, новой или существующей, выдаются группы из portal.client_groups, которых у неё раньше не было (см. Справочный центр и портал): группы только добавляются, удалённая вами группа не возвращается, а группа, дающая доступ к админке или рабочей области, игнорируется.
  3. Учётная запись с доступом к админке отклоняется: с api.access, любым правом helpdesk-pro.*, admin.login или admin.super. Человек видит «That link can't sign you in here».
  4. Плагин Login выполняет вход со своими проверками (учётная запись должна быть включена и иметь право site.login) и со всеми слушателями onUserLogin*, которые есть на сайте.
  5. Человек попадает на обращение, для которого была ссылка, на страницу портала, откуда запрашивал, или на «Your requests».

Двухфакторная аутентификация

Когда в плагине Login включена двухфакторная аутентификация (plugins.login.twofa_enabled) и у учётной записи она настроена, ссылка подтверждает почтовый ящик, но не второй фактор. Человека отправляют на страницу плагина Login для ввода кода, и после правильного кода он переходит к обращению.

Ранние обращения

У человека может быть история с вами ещё до появления учётной записи: обращения, отправленные по почте или через гостевую форму, принадлежат человеку только с адресом электронной почты. Когда он позже входит с учётной записью, адрес которой подтверждён, эти обращения автоматически присоединяются к учётной записи. Адрес считается подтверждённым, когда:

  • учётная запись принадлежит сотруднику, или
  • администратор создал учётную запись в Admin Next (или через приглашение), или
  • плагин Login требует письмо активации и учётная запись была активирована, или
  • человек использовал ссылку для входа, которую Helpdesk Pro отправил на этот адрес.

Учётная запись, адрес которой никто не подтвердил (кто-то зарегистрировался на сайте без письма активации), не получает их автоматически, потому что при регистрации любой может ввести чужой адрес. Вместо этого портал показывает такому клиенту «Verify your email to see earlier requests» в верхней части «Your requests» и на главной странице справочного центра. Кнопка отправляет ссылку на адрес учётной записи; её использование подтверждает адрес, и ранние обращения присоединяются к учётной записи со всем, что в ней было (см. Люди и конфиденциальность).

Любая ссылка для входа считается подтверждением: когда клиент с неподтверждённой учётной записью использует ссылку из одного из своих писем, адрес подтверждается и ранние обращения присоединяются.

Письмо

client-magic-link (templates/emails/helpdesk/client-magic-link.html.twig и .txt.twig, переопределяемые темой) получает subject, site, brand, recipient.name, purpose (login или verify), link, expires.minutes и expires.days. Оно помечается Auto-Submitted: auto-generated и не имеет заголовков группировки. В нём сказано «If you didn't ask for it, you can ignore this email».

Остальные письма клиентам (client-received, client-reply, client-resolved, client-triage) связывают обращение собственной ссылкой для входа для каждого получателя. Когда portal.magic_links выключен или получатель — сотрудник, они ссылаются на обычную страницу портала, которая просит читателя войти.

Настройки

На вкладке Portal & Access настроек плагина:

Ключ По умолчанию Что делает
portal.magic_links true Включает или выключает ссылки для входа. Выключено: страница входа указывает только на плагин Login, а письма клиентам ссылаются на обычную страницу портала.
portal.magic_link_minutes 30 Сколько действует ссылка, запрошенная человеком.
portal.email_link_days 7 Сколько действует ссылка в письме клиенту.