RESTful регистрация с активационным письмом

Я работаю над созданием REST API, и одна из функций — разрешить пользователям регистрироваться. Общий поток следующий:

  1. Пользователь указывает свою электронную почту и пароль с помощью клиентского приложения (SPA-приложения) и нажимает кнопку отправки.
  2. Делается запрос к API. API добавляет пользователя в базу данных, генерирует токен подтверждения и отправляет пользователю электронное письмо.
  3. Пользователь подтверждает свою электронную почту и нажимает ссылку подтверждения.
  4. API помечает учетную запись пользователя как проверенную.

Мой вопрос касается ссылки подтверждения. Должна ли ссылка указывать на клиентское приложение SPA? В этом случае клиентское приложение отправит запрос POST к API с токеном подтверждения и адресом электронной почты пользователя. Кроме того, как API должен знать ссылку на клиентское приложение (ссылку нужно добавить в письмо, и это делает API). Должен ли API хранить эту ссылку или клиент SPA должен отправлять ссылку для подтверждения в API при отправке запроса на регистрацию пользователя?

Другой подход заключается в том, чтобы ссылка шла к конечной точке, определенной API. В этом случае будет сделан запрос GET с адресом электронной почты пользователя и токеном подтверждения, и API установит учетную запись как проверенную и сообщит пользователю, что его учетная запись теперь активна. Я читал, что этот подход не соответствует принципам REST, потому что запрос GET никогда не должен изменять состояние ресурса. В этом случае пользовательский ресурс будет изменен.

Я не уверен, какое из двух решений лучше или есть лучшее решение, поэтому мой вопрос в том, какой подход лучше всего?

Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 219
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Should the link point to the client SPA application?

Если ваше «Клиентское SPA-приложение» является единственным интерфейсом для конечных пользователей, тогда да: оно должно указывать на него. Некоторые люди развертывают отдельный сервер oauth2/аутентификации, но это не похоже на то, что здесь.

The client application will make a POST request to the API with the verification token and the user email.

Токена должно хватить. Я бы не стал отправлять адреса электронной почты через URL-адреса.

Also, how should the API know the link to the client application (the link needs to be added in the email and this is done by the API). Should the API store this link, or should the SPA client send the verification link to the API when sending the request to register the user?

Оба кажутся действительно правильными конструкциями. Если вы хотите, чтобы API совершенно не знал о внешнем интерфейсе и поддерживал множество внешних интерфейсов, мне было бы разумно, чтобы клиент отправлял свои собственные конечные точки. Однако существует проблема безопасности: вы не хотите, чтобы произвольные клиенты регистрировали произвольные URL-адреса.

Если вы просто создаете один интерфейс, я не вижу проблемы в том, что API знает URL-адрес активации. Также кажется, что это будет легко изменить, если ваши требования изменятся позже.

I'm not sure which of the 2 solutions is better or if there is a better solution, so my question is what is the best approach?

В конце концов, это не так уж и важно. Ни один из подходов не звучит так, будто вы действительно загоняете себя в угол. Либо у вас есть стандартная конечная точка, которая использует HTTP-запрос javascript для активации пользователя, либо отдельная конечная точка, которая перенаправляет пользователя после активации. Оба будут работать.

Другие вопросы по теме

Воспроизведение мультимедиа из внешних источников, которым нужны заголовки в Alexa
Получение инициатора файла XXX-xsrfstatemanager.js с помощью инструментов разработчика Chrome
Простой способ позволить только администратору управлять пользователями
Использование службы аутентификации посла для требования базовой аутентификации только на некоторых маршрутах/URL-адресах (или сервисах)
Аутентификация в gitlab api для MR
Как мне сделать мое приложение React безопасным? На данный момент я могу войти в систему с помощью инструментов React DOM, что мне не хватает?
Symfony теряет сеанс аутентификации между входом в систему и перенаправлением
Проблема аутентификации сервера Datasnap с удаленной базой данных учетных данных пользователей
Как аутентифицировать пользователя в gatsby
Токен аутентификации AD не становится одинаковым для каждого пользователя в веб-чате бот-фреймворка V4