2

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

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

我当前的解决方案:我在 head 中添加了 Netlify Identity 脚本,并通过 mkdocs 中的模板插件添加了登录/注销按钮,然后创建了一个静态文档 /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 时,登录前内容会在屏幕上闪烁。

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

4

2 回答 2

3

这不会按您的意愿工作并且不安全。

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

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

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

于 2018-09-17T15:28:25.753 回答
0

我知道这是一篇旧文章,但您可以将 netlify 函数与 netlify 重定向文件结合使用。

在使用元数据注册时,您必须设置用户角色,您可以使用与 netlify 身份挂钩的 netlify 函数来执行此操作,更多信息请参见此处

创建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 帐户。

于 2022-01-08T11:46:54.160 回答