使用JavaScript(Netlify Identity)门控内容:内容在慢速连接中闪烁,如何仅在登录检查后加载?

Gating content with JavaScript (Netlify Identity): Content flashes in slow connections, how to only load it after log in check?

我不是真正的 Web 应用程序开发人员,我想询问有关控制网站内容的最佳做法。

我正准备部署使用 mkdocs 创建的文档。它使用 Netlify Identity,因为 Github 身份验证无需任何编码即可使用。

我目前的解决方案:我在head中添加了Netlify Identity脚本,在mkdocs中通过模板插件添加了login/logoff按钮,然后创建了一个静态文档/login /(在 mkdocs 中自动获取,但不会使用模板生成)。

在标准模板中有一个 JS 重定向到 /login/ 除非用户已登录:

if (window.netlifyIdentity) {
 window.netlifyIdentity.on("init", user => {
  if (!user) {
    document.location.href = "/login/";
  }
});
}

在静态页面上,只有在用户登录后才会重定向到 /:

  if (window.netlifyIdentity) {
    window.netlifyIdentity.on("init", user => {
      if (!user) {
        window.netlifyIdentity.on("login", () => {
          document.location.href = "/";
        });
      }
    });
  }

我希望这是一种合理的解决方法。文档不存储任何重要内容,但我仍然不希望公开该内容。

但我注意到在慢速连接时重定向需要一两秒钟,因此当访问深度 URL 时,内容会在登录前在屏幕上闪烁。

如何才能停止此操作并仅在执行登录检查后才加载内容?

这不会像您希望的那样工作并且不安全。

如果我想在没有帐户的情况下阅读您的内容,只需 disable JavaScript 在我的浏览器中(点击几下鼠标)即可加载您的网站,但重定向永远不会 运行。

无论如何,启用 JavaScript 后,其工作方式是浏览器下载页面,然后下载任何资源(包括脚本),最后 运行 任何脚本。没有办法改变这一点。当然,在一个快速的系统上,用户可能感觉不到延迟,因为延迟很短,但延迟总是存在的。这就是浏览器的工作方式。

如果您不希望您的用户在登录后才能访问这些信息,那么您必须在他们登录后才能将信息发送出去。换句话说,您需要配置您的服务器在收到用户有权接收该信息的验证之前,根本不发送该页面。你如何做到这一点取决于你使用的服务器等等,这将是一个单独问题的主题。

我知道这是旧的 post 但您可以结合使用 netlify 函数和 netlify 重定向文件。

您在使用元数据注册时必须设置用户角色,您可以使用挂接到 netlify 身份的 netlify 函数来完成此操作,更多 here

创建一个名为 identity-signup.js 的函数,当用户注册时会自动调用此函数。

exports.handler = async (event) => {
    const { user } = JSON.parse(event.body)
    // you could do something with the user here: eg console.log(user.email)
    // or using stripe: const customer = await stripe.customers.create({ email: user.email });
    return {
        statusCode: 200,
        body: JSON.stringify({
            app_metadata: {
                roles: ['free']
            }
        })
    }
}

拥有角色后,您可以像这样简单地创建一个 _redirects 文件:

/authedcontent/* 200! Role=free
/authedcontent/ / 404

稍后您可以扩展 netlify 功能以将用户详细信息保存在外部数据库中,或者设置条带订阅。

唯一需要注意的是,这需要一个付费的 netlify 帐户。