将 CSRF 令牌嵌入 Ember CLI 应用程序

Embed CSRF token into Ember CLI application

我正在设计新的 Ember CLI 应用程序。我将使用 Ember Simple Auth 进行授权。而且我还需要使用 CSRF 保护。我知道如何将令牌注入请求。问题是如何以正确的方式将令牌嵌入到应用程序中。

要求token在后台生成并嵌入到页面中。它应该与 API 用于验证请求的相同。

在我的例子中,API 和 Ember 应用程序将由同一 Web 服务器提供服务(很可能是 Microsoft IIS,因为 API 是使用 .NET MVC 构建的)。因此,Web 服务器应该生成令牌,并在其索引文件被请求后以某种方式将其嵌入到 Ember 应用程序中。

但是 Ember CLI 在其构建过程中生成静态 index.html 文件。我只看到两种嵌入令牌的方法。

第一个是在每个请求上解析 Ember 的 index.html 文件并将 CSRF 令牌元标记嵌入到适当的位置。我不太喜欢这种方式。

第二个是让 Ember CLI 在构建过程中生成 index.aspx 而不是 index.html。在这种情况下,网络服务器会自动放置令牌。我更喜欢这种方式,但我不确定是否可行。如果是那么该怎么做?

也许,还有其他更好的方法?任何帮助和建议将不胜感激。

可以实现你的第二个想法。您需要在 ember-cli-build.js:

中指定 options.outputPaths.app.html 属性 of EmberApp
const app = new EmberApp({
    outputPaths: {
        app: {
            html: 'index.aspx'
        }
    }
});

这样做会导致 Ember CLI 将 index.aspx 而不是 index.html 写入文件系统:

你可以read more about configuring output paths of your Ember CLI application in user-guide.

您也可以直接在 Ember CLI 的 ember-app.js source code 中挖掘,看看是否可以根据您的需要调整选项。

Is it possible to make it environment-dependent? It works perfectly for production build. But it doesn't work for development since Ember CLI can not serve .aspx files. So it would be nice to overwrite output files for production builds only and use generic ones for development and test environments.

您可以通过检查 app.env 的值来实现此目的。因此,在 ember-cli-build.js 中,不要将 outputPaths 作为参数传递,而是使用以下技术:

const app = new EmberApp();

if (app.env === 'production') {
    app.options.outputPaths.app.html = 'index.aspx';
}

这样,在为 production 构建时,您仍然会在 dist/ 中获得 index.aspx,但是 developmenttest 环境的 outputPaths 选项未被触及并在 development/testing 工作。