Auth0行动的快速技巧和窍门

219 阅读8分钟

Actions使你有可能定制Auth0的工作方式。它们通过让你在各种Auth0工作流程中插入脚本--称为Actions--来增加功能并提高你的用户体验。

行动可能很复杂,但它们不需要复杂。在这篇文章中,我将向你展示一些Action,你可以在一两分钟内输入,但执行的任务你会发现在你的应用程序的日常运行中很有用。

将用户重定向到一个 "停工 "页面

迟早,你的应用程序会有停机时间。如果一切顺利的话,这将是计划内的停机,但也可能会有计划内的停机。在这两种情况下,有一个网页是很有用的,你可以在那里重定向用户,通知他们你的应用程序不可用,并提供其他细节。

你可以通过在登录流程中添加以下动作来实现这一目的,将 {SYSTEM DOWNTIME PAGE URL}替换为解释停机的网页的位置。

// Login flow

exports.onExecutePostLogin = async (event, api) => {
  api.redirect.sendUserTo("{SYSTEM DOWNTIME PAGE URL}");
};

当你的应用程序发生故障时,把这个Action拖到你的租户的Login流程中。它使用 api.redirect.sendUserTo()方法,在用户登录后将其重定向到给定的URL。

请记住,用户只有在成功登录后才会看到停机页面。

暂时禁止新账户的注册

好事做得太多也有可能的。一般来说,你希望有很多用户注册使用你的应用程序,但有时你需要停止注册以扩大你的系统或让你的员工赶上。

如果你曾经遇到这种情况,你可以采取的措施之一是暂时停止注册。你可以通过在用户注册前流程中创建一个名为 "拒绝新注册 "的新动作来实现这一目的。

// Pre User Registration flow

exports.onExecutePreUserRegistration = async (event, api) => {
  api.access.deny('too_many_signups', "We’re not accepting sign-ups at the moment.");
};

这个Action使用 api.access.deny()方法,它取消了用户的注册过程和任何后续的Action。它需要两个参数。

  • reason:这是一个字符串,提供一个内部原因,说明你为什么要拒绝用户注册账户的尝试。这是为了应用程序的开发人员和管理员的利益,将出现在租户的日志中。我们建议这是一个简短的标签,而不是一个句子。
  • userMessage:这也是一个字符串,它是面向用户的原因,为什么他们不能注册一个账户。你希望这个消息对用户友好,我们建议这是一个完整的句子。

随着 "拒绝新注册 "行动的部署并被添加到用户注册前流程中,这就是用户试图注册时看到的情况。

“Sign up” screen displaying the message “We’re not accepting sign-ups at the moment.”

虽然登录框显示了 "我们目前不接受注册 "的信息,但你可以看到,该信息与包含密码要求的大红框相形见绌。

目前,没有办法 "关闭 "那个大红框,它是在我们有行动和用户注册前流程之前创建的。目前,你应该使用至少两句话的信息,以便让他们更容易被看到。

“Sign up” screen displaying a longer version of the mesage “We’re not accepting sign-ups at the moment.”

初始化一个新用户的元数据

每个Auth0用户账户都将有关用户的信息存储为元数据,你的应用程序可以访问这些元数据。有两种元数据被存储。

  1. **用户元数据。**一组关于用户的属性,影响应用程序的核心功能。用户可以查看和修改这些信息,这些信息通常包括用户偏好和设置。
  2. **应用元数据。**一组关于用户的属性,确实影响到应用程序的核心功能。用户不能查看和修改这些信息,其中包括诸如他们在应用程序中的状态,或任何其他决定用户可以使用哪些功能或活动的设置。

你可以在用户注册前流程中使用一个动作,将用户的用户和应用元数据设置为它们的初始值。在下面的例子中,该动作在新创建的用户的用户元数据和应用元数据中都设置了值。

// Pre User Registration flow

exports.onExecutePreUserRegistration = async (event, api) => {
  api.user.setUserMetadata("ui_color", "default");
  api.user.setUserMetadata("use_verbose_messages", false);  
  api.user.setAppMetadata("is_new_user", true);
  api.user.setAppMetadata("reward_status", 0)
};

上面的代码使用了两个方法-- api.user.setUserMetadata()api.user.setAppMetadata()- 来分别初始化新用户的用户和应用元数据。

在用户注册前流程中插入这个动作后,每个新用户--无论是通过点击登录框中的注册链接,还是通过Auth0仪表盘或管理API创建的,都将拥有以下用户和应用元数据。

A user account’s user and app metadata displaying the initialized metadata after the Action is run.

在更改密码后给用户发电子邮件

在用户的账户密码改变后,立即给用户发送电子邮件是很好的。如果用户做了更改,这封邮件就是提醒他们最后一次更新密码的时间。如果用户没有进行更改,这可能是一个不受欢迎的人访问他们的账户的信号。

你可以通过在发布密码流程中添加一个动作来设置这种电子邮件通知,如下图所示。

// Post Change Password flow

function sendGmail(username, password, emailAddress, subject, message) {
  try {
    const send = require('gmail-send')({
      user: username,
      pass: password,
      to: emailAddress,
      subject: subject,
    });
    send({
      text: message,  
    }, (error, result, fullResult) => {
      if (error) console.error(error);
      console.log(result);
    })
  } catch (err) {
    console.log(`Error sending email to ${emailAddress}:`, err.message)
  }
}

exports.onExecutePostChangePassword = async (event) => {
  sendGmail(
    event.secrets.GMAIL_USERNAME,
    event.secrets.GMAIL_PASSWORD,
    event.user.email,
    "Your password has been changed",
    `
This is a quick message to let you know that your password has been changed. If you made this change,
you can ignore this email. If you DIDN’T make this change, please contact the administrator.
    `
  );
};

这是一个比前面的例子更复杂的动作。它需要更多的设置,我在下面做了概述。

等等......一个Gmail账户?

虽然你不应该使用Gmail作为生产应用程序的电子邮件服务器,但我发现一个专门用于测试的Gmail账户对原型设计很有用。

要设置这样一个账户,请注册一个新的Gmail账户。不要在这个账户上启用双因素认证,因为这样做会使下一步的程序不可用。

进入你新创建的账户的主页,从页面左侧的菜单中选择安全。向下滚动,直到你看到较不安全的应用程序访问部分,并点击打开*访问(不推荐)*链接。将 "允许不太安全的应用程序"开关设置到 "打开 "位置。

现在你将能够使用这个Gmail账户代表你的行动发送电子邮件。

请记住,你应该把这个账户只用于测试目的!对于生产应用,请使用专门的电子邮件发送API。

不要忘记,Gmail有一个API,提供对用户Gmail账户中数据的授权访问,可以用来执行一些操作,包括阅读、分类、发送和备份邮件,以及管理用户设置,如别名、签名、过滤和转发。

存储你的秘密

onExecutePostChangePassword()函数将发送电子邮件的工作委托给另一个函数。 sendGmail().当需要将Action移出原型阶段时,我可以让 onExecutePostChangePassword()调用另一个具有相同参数的函数,访问更适合生产的电子邮件API。

你可能已经注意到,我没有把Gmail帐户的用户名和密码值硬编码到Action中。相反,它们似乎是 event.secrets对象的属性。这些是 秘密- 这些值被安全地存储在动作的秘密部分。

要管理一个Action的秘密,点击Action编辑器左侧的钥匙图标。这将打开秘密面板,在那里你可以添加、编辑和删除你想保密的值。

The “Secrets” panel and its controls.

当你点击添加秘密按钮时,会出现一个弹出窗口,允许你将一个秘密定义为一个键值对。

The “Define Secret” dialog box.

一旦定义,你就可以把秘密作为对象的属性来访问。 event.secrets对象的属性。我定义的两个秘密是 GMAIL_USERNAME用于我的原型Gmail账户的用户名和 GMAIL_PASSWORD的密码--可以在动作代码中被访问为 event.secrets.GMAIL_USERNAMEevent.secrets.GMAIL_PASSWORD.

添加模块

sendGmail()函数使用 require()函数来包含 gmail-sendnpm模块,通过Gmail向用户发送电子邮件通知。但你如何使 gmail-send提供给你的Action?

你使用模块面板来做,你可以通过点击动作编辑器左侧的包图标来访问它。

The “Modules” panel and its controls.

模块面板让你从npm庞大的模块库中的任何模块组合中引入功能。

要向你的Action添加模块,点击添加模块按钮。一个弹出窗口会出现,允许你指定一个要包括的npm模块,并可选择哪个版本。

The “Add Module” dialog box.

我把最新版本的 gmail-send模块到Action中。

结论

正如我在一开始提到的,Action不需要太长或太复杂就能达到有用的效果。有时你只需要一行就够了。

你应该把上面提供的动作作为一个 "跳板 "来编写你自己的自定义动作,以满足你的用户的需要。发挥你的想象力,不要害怕做实验!


© 2013-2022 Auth0公司。保留所有权利。