3

我正在使用 Webpack 5 Module Federation 来使用远程模块。一切都按预期工作。

到目前为止,远程模块 URL 是公开的,不需要任何类型的身份验证。这对开发人员来说很好。目的。但在生产中,访问该远程模块将需要某种身份验证。

我在 Webpack 文档中找不到任何关于身份验证的信息。

我想知道在这种情况下我有什么选择?

4

2 回答 2

0

我的回答对于像 JWT 这样的身份验证很有用,标头中带有令牌。

但是,如果您了解原理 - 您可以实现任何重用逻辑并实现任何身份验证。

我有管理面板并分为核心和几个模块。

我将管理面板分为 3 个部分:

  1. 核心:auth、Vues、路由器
  2. 模块 1 - 员工(模块之一)
  3. 模块2

我的 auth 像 JWT auth 一样工作(为每个请求添加了 auth 标头)。我将标头授权写入标头并在每个请求中传递令牌。

所以当我从模块发出任何请求时,任务就是在模块中获取这个令牌。如果没有这个逻辑,我会得到 301 并重定向,因为请求没有标头。

为此,我使用 axios 拦截器为每个请求添加标头(在核心中)和用户类从每个请求的本地存储中提取令牌(User.getToken() - 也在核心模块中)


您可以像在后端微服务中一样使用模块联合来实现交叉身份验证。

我完成已解决任务的步骤

  1. 为身份验证创建类 -例如用户
  2. 使用 User 类在主机中创建公开 | 我的意思是核心模块(我公开了 CoreModule 类,所以我不需要单独公开所有员工)并且在这个类中我导入 User 类
  3. CoreModule 具有调用 User.init() 的方法 init - 在此方法中,我发出所有初始请求或从 ls 获取令牌
  4. 在 Module1 (EmployeeModule) 中导入 CoreModule 并在请求之前调用 CoreModule.init() - 例如在挂载页面挂钩上(如果您使用 React、Vue 或 Angular)。
  5. 如果您只想优化和初始化它,您可以公开 EmployeeModule (Module1) 并在那里导入 CoreModule。比您需要调用具有 CoreModule.init() 的 EmployeeModule.init() 的初始化。我将 EmployeeModule 暴露给 CoreModule 并在加载页面异步之前对其进行初始化(在我的情况下,我将所有模块导入核心并初始化它们)

这个怎么运作

当您在核心主机模块中导入 User 和 init 时 - 它会创建新实例,并且此类的新导入将返回指向新创建的类的链接。但是如果你从 remoteEntry.js 导入这个类 - 将创建一个新实例,所以你需要先初始化它。这取决于您何时启动它以及您是否需要它。

但是如果你想在多个模块中使用同一个类,你需要在使用前进行初始化,因为 webpack bundle 和 remoteEntry.js 不共享创建的类实例。

结果,您将在 Core 和 module1 中拥有 User 类,与使用 User.getToken() 的拦截共享 axios,我希望它适用于您的情况:)

感谢您的阅读,祝您有美好的一天!:)

https://codesandbox.io/s/relaxed-bhaskara-tzlrj?file=/src/EmployeesModule.js 这里是例子

于 2021-05-23T18:41:46.800 回答
0

您应该在托管您的联合模块的服务器上进行一些身份验证,例如 nginx。


proxy_cache_path /data/nginx/cache levels=1 keys_zone=foo:10m;

server {
    ...

    location / {
        auth_jwt             "closed site";
        auth_jwt_key_request /jwks_uri;
    }

    location = /jwks_uri {
        internal;
        proxy_cache foo;
        proxy_pass  http://idp.example.com/keys;
    }
}
于 2021-04-28T22:19:27.160 回答