Подписка на тему по email без регистрации

Тогда почему бы не использовать вход через социальные сети?

1 лайк

Тогда почему бы не использовать социальные логины?

Верно, это охватывает многих людей. Но всё больше людей, как я, отказываются от социальных логинов из-за недоверия к провайдерам аутентификации. Основные провайдеры — одни из наименее доверенных компаний на планете.

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

Социальные логины — это решение технической проблемы, а не психологической.

3 лайка

И всё же все почтовые рассылки работают именно так.

Если электронная почта, которую вводит пользователь, совпадает с адресом, полученным при входе через социальные сети, и учитывая, что при аутентификации через социальные сети запрашивается разрешение только на доступ к электронной почте (помимо общедоступных данных, которые и так открыты), то я не вижу проблемы в использовании такого входа.

Например, я обычно авторизуюсь через Google или GitHub, и когда запрашиваются разрешения, я проверяю, что запрашивается только адрес электронной почты. В этом случае я считаю такой вариант гораздо удобнее, чем ввод адреса вручную, поскольку мне не нужно его печатать (а при входе по электронной почте, скорее всего, ещё потребуется её подтверждение). Вход через социальные сети занимает всего 1–2 клика.

На самом деле, гораздо вероятнее, что я подпишусь на рассылку (или что-то подобное) через вход в социальные сети, чем через ввод адреса. Конечно, это мой личный опыт.

Отвечаю на свой собственный ответ.

Я не нашел вариантов регистрации без пароля в каталоге плагинов. Однако я наткнулся на эту тему, где @codinghorror высказал ряд возражений против этой идеи: Why is password still required at signup?. Я не согласен с его доводами, но, похоже, обсуждение этой идеи на этом и закончилось.

Похоже, пришло время либо достать из пыли свою книгу по Ruby, либо написать в канал Marketplace.

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

POST /users.json
Запрос:
  {
    "name": "string",
    "email": "string",
    "password": "string",
    "username": "string",
    "active": true,
    "approved": true,
    "user_fields[1]": true
  }


POST /t/{id}/notifications.json
Запрос:
  {
    "notification_level": "0"
  }

в одну:

POST /plugin-name/users.json
Запрос:
  {
    "email": "string",
    "name": "string",       // теперь необязательное
    "password": "string",   // теперь необязательное
    "username": "string",   // теперь необязательное
    "active": true,
    "approved": true,
    "user_fields[1]": true,
    "notifications": [      // новое свойство
      {
        "topic_id": "some-topic-id",
        "notification_level": "0"
      }
    ]
  }

Добавится следующая логика:

  • если name равен null, автоматически сгенерировать его
  • если username равен null, автоматически сгенерировать его. Возможно, просто установить значение UUID
  • если password равен null, установить значение UUID 4-го типа или просто случайную строку
  • если len(notifications) > 0, добавить запись уведомления в БД

Кроме того, в приветственное письмо следует добавить информацию о том, как задать собственное имя пользователя, имя и пароль. Это несложно, так как большая часть соответствующей информации уже находится по адресу https://example.com/u/{username}/preferences/account. Можно просто добавить один новый абзац.

И, конечно же, потребуется компонент UI, который как минимум должен содержать:

  • поле для ввода email
  • флажок «Следить за этой темой»
  • кнопку отправки

В целях соответствия GDPR также рекомендуется добавить ссылку на страницу документации, где подробно объясняется, что означает «Следить», какие письма пользователь будет получать и т. д.

3 лайка

Если вы разрешаете создание тем по электронной почте, там уже есть код для создания «промежуточных» пользователей. У них случайное имя пользователя, и каждый привязан к определенному адресу электронной почты. Вы можете «забрать» этот аккаунт, войдя в систему и подтвердив адрес электронной почты.

Смотрите:

Возможно, развитие этой идеи будет полезным?

3 лайка

Спасибо за подсказку. Это действительно выглядит идеально.

Я изучу код и посмотрю, смогу ли я напрямую вызвать функцию, которая создаёт пользователя в ожидании подтверждения при получении письма.

1 лайк

Да, это было моё первоначальное предположение, но свойство Active может оказаться не самым полезным.

Полный пользователь: staged = false, active = true, то есть это разные атрибуты (запомнить себе!)

Перспективное предложение, @mattdm… может значительно сократить объём работы!

3 лайка

Я потратил немного времени на изучение кода. Мне кажется, что что-то вроде этого (предупреждение: скорее всего, не будет работать, так как я ещё не пробовал) позволит пользователю опубликовать ответ, указав только адрес электронной почты. Буду благодарен за любые ваши комментарии.

Особенно я не уверен, что это лучший способ создания «промежуточного» (staged) пользователя. Я не нашёл метода, который бы специально создавал таких пользователей.

class SomePluginController < ApplicationController

  # Убедиться, что в базе данных есть промежуточный пользователь
  def ensure_user

    # Проверить, существует ли промежуточный пользователь
    user = User.where(staged: true).with_email(params[:email].strip.downcase).first

    # Создать промежуточного пользователя вручную
    if !user
      user = User.new
      user.staged = true
      user.email = params[:email]
      user.active = false
      user.save!
    end
    
    user
  end

  # Подписаться на тему как промежуточный пользователь
  def staged_watch

    user = ensure_user

    topic = Topic.find(params[:topic_id].to_i)
    TopicUser.change(user, topic.id, notification_level: params[:notification_level].to_i)

  end

  # Ответить на тему как промежуточный пользователь
  def staged_reply
 
    user = ensure_user

    manager = NewPostManager.new(user,
                             raw: params[:body],
                             topic_id: params[:topic_id])
    result = manager.perform

  end

end
4 лайка

Переросла ли когда-нибудь эта беседа в плагин или в обнаруженный процесс с использованием Staged Users?

2 лайка