# 使用电子邮件地址关注主题，无需注册

**URL:** https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318
**Category:** Feature
**Created:** [2022年一月9日 21:23 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318 "2022-01-09T21:23:16Z")
**Posts on this page:** 11
**Page:** 2

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2022年一月10日 17:03 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/21 "2022-01-10T17:03:15Z")

</div>

> [@alangibson](#):
>
> 触点的数量只是问题之一。用户非常讨厌创建和管理密码。他们已经拥有的账户越多，就越不愿意创建一个新账户。

那为什么不使用社交登录呢？

---

<div class="post-metadata">

### Author: ![alangibson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/alangibson/32/245888_2.png) [@alangibson](https://meta.discourse.org/u/alangibson)
#### Post date: [2022年一月10日 17:07 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/22 "2022-01-10T17:07:30Z")

</div>

> 那么为什么不使用社交登录呢？

确实，这能覆盖很多人。但也有越来越多像我一样的人，因为不信任登录提供商而选择不使用社交登录。主要的提供商是一些地球上最不可信的公司。

而且，社交登录也无法解决人们根本不想加入一个他们还不了解的社区的问题。回到我最初的例子，我是通过谷歌搜索特定信息来到这个社区的。我目前对成为这个社区的一员没有任何兴趣。通过最省力的方式保持联系，能让社区有机会展示其价值并吸引那个人加入。

社交登录是解决技术障碍的方案，而不是心理障碍的方案。

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [2022年一月10日 18:07 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/23 "2022-01-10T18:07:43Z")

</div>

> [@pfaffman](#):
>
> 将电子邮件发送给不愿注册帐户的人是 **一个非常糟糕的主意**

然而，所有的电子邮件列表都是这样工作的。

---

<div class="post-metadata">

### Author: ![lucasbasquerotto](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/lucasbasquerotto/32/133376_2.png) [@lucasbasquerotto](https://meta.discourse.org/u/lucasbasquerotto)
#### Post date: [2022年一月10日 19:28 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/24 "2022-01-10T19:28:48Z")

</div>

> [@alangibson](#):
>
> 而且社交登录也不能解决人们不想加入一个他们还不了解的社区的问题。

如果用户输入的电子邮件与社交登录的电子邮件相同，并且考虑到除公共数据（已公开）之外，在通过社交登录进行身份验证时请求的权限是电子邮件地址，那么我不认为社交登录存在问题。

例如，我通常使用 Google 或 GitHub 进行身份验证，当请求权限时，我只确保只请求电子邮件。在这种情况下，我认为这比输入电子邮件地址方便得多，因为我不必输入它（并且使用电子邮件登录我可能还需要验证电子邮件）。通过社交登录，只需单击 1 或 2 次即可完成。

实际上，我更可能通过社交登录订阅新闻通讯（或类似内容），而不是输入电子邮件。当然，这只是我的个例。

---

<div class="post-metadata">

### Author: ![alangibson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/alangibson/32/245888_2.png) [@alangibson](https://meta.discourse.org/u/alangibson)
#### Post date: [2022年一月11日 07:37 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/25 "2022-01-11T07:37:37Z")

</div>

回复我自己的帖子。

我在插件目录中没有找到任何无密码注册选项。我确实找到了这个帖子，其中 @codinghorror 对这个想法提出了一些反对意见：[Why is password still required at signup?](https://meta.discourse.org/t/why-is-password-still-required-at-signup/89915) 我不同意他的观点，但这似乎是关于这个想法的讨论的终点。

看起来是时候重新拿起我的 Ruby 书籍或者在 #Marketplace 上发帖了。

---

<div class="post-metadata">

### Author: ![alangibson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/alangibson/32/245888_2.png) [@alangibson](https://meta.discourse.org/u/alangibson)
#### Post date: [2022年一月11日 09:59 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/26 "2022-01-11T09:59:30Z")

</div>

我已经查看了现有的 API 端点。为了完成我上面概述的内容，我需要一个结合了这两个端点功能的插件：

```plaintext
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"
  }

```

合并为：

```plaintext
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，则设置为 type 4 uuid 或随机字符串
- 如果 len(notifications) \> 0，则向数据库添加一个通知条目

此外，欢迎邮件中应添加一些关于如何设置自己的用户名、姓名和密码的说明。这很容易实现，因为大部分内容都在 [https://example.com/u/{username}/preferences/account。这可以只是一段新插入的文字。](https://example.com/u/%7Busername%7D/preferences/account%E3%80%82%E8%BF%99%E5%8F%AF%E4%BB%A5%E5%8F%AA%E6%98%AF%E4%B8%80%E6%AE%B5%E6%96%B0%E6%8F%92%E5%85%A5%E7%9A%84%E6%96%87%E5%AD%97%E3%80%82)

当然，您还需要一个 UI 组件，至少包含：

- 一个电子邮件字段
- 一个“关注此主题”复选框
- 一个提交按钮

出于 GDPR 的目的，最好还添加一个指向文档页面的链接，详细说明“关注”的含义、他们将收到哪些电子邮件等。

---

<div class="post-metadata">

### Author: ![mattdm](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mattdm/32/216484_2.png) [@mattdm](https://meta.discourse.org/u/mattdm)
#### Post date: [2022年一月13日 05:10 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/28 "2022-01-13T05:10:14Z")

</div>

如果允许通过电子邮件创建主题，已经有代码可以创建“暂存”用户。这些用户具有随机的用户名，并且每个用户都与一个电子邮件地址相关联。您可以通过登录并验证该电子邮件地址来“认领”该帐户。

请参阅

> [@What is a staged user?](https://meta.discourse.org/t/what-is-a-staged-user/107843):
>
> I am struggling to find any resource on what a staged user is, what makes them different from a regular user and how this is beneficial to the community, the admin or the stages user themselves. What is/are staged users? confused

也许在此基础上进行构建会有所帮助？

---

<div class="post-metadata">

### Author: ![alangibson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/alangibson/32/245888_2.png) [@alangibson](https://meta.discourse.org/u/alangibson)
#### Post date: [2022年一月13日 10:29 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/29 "2022-01-13T10:29:43Z")

</div>

谢谢你的提示。这看起来确实很完美。

我会深入研究代码，看看是否可以直接调用在收到电子邮件时创建暂存用户的代码。

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2022年一月13日 10:42 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/30 "2022-01-13T10:42:18Z")

</div>

是的，这曾是我的初步想法，但 `Active` 属性可能不是最有用的。

一个完整的用户是 `staged = false`，`active = true`，所以这些是不同的属性（提醒自己！）

> [@sam](#):
>
> ### Active
> 
> 账户拥有已验证的电子邮件，因此在 Discourse 实例中是活跃的
> 
> - 账户可以登录 Discourse，非活跃账户不能登录
> - 非活跃账户只能验证其电子邮件（以及完成注册所需的其他路由）。
> 
> **存储** ：`users` 表中的 `active` 布尔列

> [@sam](#):
>
> ### Staged
> 
> 系统为电子邮件集成自动创建的特殊占位符账户
> 
> - 绝不会发送电子邮件摘要
> - 自动关注其参与的所有消息，并接收回复通知
> - 可以通过电子邮件回复通知
> - 用户名和姓名是自动选择的
> - 账户仍可以使用相同的电子邮件注册并“接管”占位符账户。
> - 尝试向占位符账户发送密码重置时，忘记密码将不起作用
> 
> **存储** ：`users` 表中的 `staged` 字段

@mattdm 的建议很有前景……可能会大大减少所需的工作量！

---

<div class="post-metadata">

### Author: ![alangibson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/alangibson/32/245888_2.png) [@alangibson](https://meta.discourse.org/u/alangibson)
#### Post date: [2022年一月15日 12:07 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/31 "2022-01-15T12:07:47Z")

</div>

我花了一些宝贵的时间来研究代码。我认为类似这样的东西（警告：很可能无法正常工作，因为我还没有尝试过）可以允许用户仅通过电子邮件发布回复。我很想听听您的意见。

我尤其不确定这是创建暂存用户的最佳方法。虽然我还没有找到任何专门创建暂存用户的方法。

```plaintext
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

```

---

<div class="post-metadata">

### Author: ![denvergeeks](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/denvergeeks/32/327671_2.png) [@denvergeeks](https://meta.discourse.org/u/denvergeeks)
#### Post date: [2023年二月3日 15:59 UTC](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318/32 "2023-02-03T15:59:58Z")

</div>

这次对话是否演变成了一个插件或一个利用分阶段用户（Staged Users）的已发现流程？

[上一頁](https://meta.discourse.org/t/watch-topic-using-email-address-without-requiring-registration/214318.md?page=1)
