# 自动登录 Discourse 网站

**URL:** https://meta.discourse.org/t/login-to-discourse-website-automatically/125086
**Category:** Marketplace
**Created:** [2019年八月7日 04:52 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086 "2019-08-07T04:52:28Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![hosna](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hosna/32/99969_2.png) [@hosna](https://meta.discourse.org/u/hosna)
#### Post date: [2019年八月7日 04:52 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086/1 "2019-08-07T04:52:28Z")

</div>

**您希望完成什么工作？**

我有一个移动应用程序。Discourse 是我的身份验证源。用户需要输入用户名和密码才能登录移动应用。然后，我将调用 Discourse 的登录 API 来验证用户。

现在，移动应用中有一些指向 Discourse 论坛的链接。我希望用户在点击这些链接时能自动登录到论坛。目前，用户需要两次输入密码：第一次是登录应用时，第二次是登录论坛时，这带来了非常糟糕的用户体验。

既然可以通过电子邮件发送链接实现无密码登录，我认为此流程也应该可行。或许可以通过一个简单的插件来实现。

**您希望何时完成？**  
1 周。

**您能为此任务提供的预算（美元）是多少？**  
300 美元

---

<div class="post-metadata">

### Author: ![hosna](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hosna/32/99969_2.png) [@hosna](https://meta.discourse.org/u/hosna)
#### Post date: [2019年八月20日 06:54 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086/2 "2019-08-20T06:54:52Z")

</div>

这不可能吗？还是报价太低了？🤔

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [2019年八月20日 08:19 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086/3 "2019-08-20T08:19:08Z")

</div>

嘿 🙂

这实际上比看起来要复杂一些。

通过电子邮件登录的工作原理是：当你在登录弹窗中点击“使用电子邮件”按钮时，系统会生成一个特定于该用户的令牌，并将其存储在 `email_tokens` 中。你可以在链接中看到该令牌（即那串数字和字母）：

```plaintext
http://localhost:3000/session/email-login/69c4953ff0726b5f4c2b26c1e3563b79

```

你必须在每次用户登录你的应用时，为应用中的链接生成这样的令牌。我认为（？）该功能目前尚未通过 API 公开，因此你需要先设置一个端点。

该端点必须通过身份验证进行保护。你需要在你的应用中实现相应的处理机制。也许你已经有了？

接下来，你还需要考虑令牌过期等问题。令牌应该保持有效多长时间？令牌过期后，如何获取新令牌并更新链接？

感觉应该有一种比事后添加此功能更好的方式来处理这个问题。

---

<div class="post-metadata">

### Author: ![hosna](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hosna/32/99969_2.png) [@hosna](https://meta.discourse.org/u/hosna)
#### Post date: [2019年八月20日 08:23 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086/4 "2019-08-20T08:23:40Z")

</div>

是的，我正好也在想这个问题。既然邮件登录已经实现，那么这应该是可行的。具体的实现方式我不太清楚，也许可以通过插件来完成。如果你能做到，请告诉我。

> [@angus](#):
>
> 该端点必须通过身份验证进行保护。你需要在应用中处理这一点。也许你已经有相应的方案了？

是的，身份验证是通过 Discourse 登录 API 完成的，这方面没有问题。

> [@angus](#):
>
> 那么你需要考虑令牌过期等问题。令牌应该保持有效多长时间？令牌过期后如何获取新令牌并更新链接？

邮件登录链接是否有过期时间？我们可以使用相同或类似的机制。  
至于获取新令牌等其他事项，将由应用自行处理。

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [2019年八月20日 08:43 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086/5 "2019-08-20T08:43:44Z")

</div>

是的，电子邮件令牌的过期时间由站点设置“电子邮件令牌有效小时数”决定。

所以，基本上您想要一个插件，该插件添加一个端点来为用户创建并返回一个 email\_token，并且您会在令牌过期时定期调用它？

---

<div class="post-metadata">

### Author: ![hosna](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hosna/32/99969_2.png) [@hosna](https://meta.discourse.org/u/hosna)
#### Post date: [2019年八月20日 08:47 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086/6 "2019-08-20T08:47:10Z")

</div>

> [@angus](#):
>
> 所以基本上，你想要一个插件，该插件添加一个端点来为用户创建并返回一个 email\_token，并且你会在令牌过期时定期调用它？

这对我来说足够了。

另外，由于我想将用户引导至特定主题，如果能添加主题 ID 或链接，并在登录后将用户重定向到该主题，那就完美了。

---

<div class="post-metadata">

### Author: ![pebble](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pebble/32/150652_2.png) [@pebble](https://meta.discourse.org/u/pebble)
#### Post date: [2019年八月23日 12:38 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086/7 "2019-08-23T12:38:49Z")

</div>

> [@angus](#):
>
> 所以基本上，你想要一个插件，它能添加一个端点来为用户创建并返回一个 email\_token，并且你会在令牌过期时定期调用它，对吗？

另一种方法是否可以是让应用中的链接指向你自己的后端。当你点击链接时，系统会在那一刻生成一个合适的链接，并将客户端重定向到正确的位置。  
这意味着你无需在用户点击之前生成认证链接。

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [2019年八月26日 02:08 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086/8 "2019-08-26T02:08:30Z")

</div>

是的，这在应用端可能更高效。不过，我认为 Discourse 中的端点应该保持不变。

---

<div class="post-metadata">

### Author: ![hosna](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hosna/32/99969_2.png) [@hosna](https://meta.discourse.org/u/hosna)
#### Post date: [2019年八月26日 07:30 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086/9 "2019-08-26T07:30:07Z")

</div>

> [@pebble](#):
>
> 另一种方法是否可以让应用中的链接指向你自己的后端？

这样的话，我们如何确保用户已通过身份验证？

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [2019年九月25日 07:44 UTC](https://meta.discourse.org/t/login-to-discourse-website-automatically/125086/10 "2019-09-25T07:44:03Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
