angular - 角度动态配置
问题描述
全部,
我有一个关于如何为我的 Angular Web 应用程序提供一些运行时配置选项的问题。以下是详细信息,但我所追求的是能够一次编译我的 Angular Web 应用程序,然后将其部署到多个环境中,并且只需要更改端点。
我发现,一旦将下面的 JSON 文件导入 app.module.ts 文件并在编译时引用,这些值就会被硬编码到应用程序中,因此当我将应用程序移至我们的测试时服务器并尝试运行应用程序,一旦发生 MSAL 身份验证并将其重定向回错误的 Uri。
基本上它不是在运行时读取 auth-config.json 文件,而是在编译时读取。有没有办法让它在运行时读取它?
我正在使用 Microsoft 的包进行 MSAL / Azure AD 身份验证。
它使用一个名为 auth-config.json 的 json 文件。这是它的一个片段
{
"configuration": {
"redirectUri": "https://SomeWebSiteName-D.domainname.com",
"postLogoutRedirectUri": " https://SomeWebSiteName-D.domainname.com "
},
"apiBaseUrl": "https://SomeWebSiteNameAPI-D.domainname.com/api/"
}
这个 json 文件像这样导入到 app.module.ts 文件中。
import * as auth from '../assets/config/auth-config.json';
然后使用它来配置 MSAL 包。这是引用其中一些数据的函数之一。
export function MSALInstanceFactory(): IPublicClientApplication {
return new PublicClientApplication({
auth: {
clientId: auth.credentials.clientId,
authority: 'https://login.microsoftonline.com/' + auth.credentials.tenantId,
redirectUri: auth.configuration.redirectUri
},
cache: {
cacheLocation: BrowserCacheLocation.LocalStorage,
storeAuthStateInCookie: isIE, // set to true for IE 11
},
});
}
稍后在 App.module.ts 文件中,上述函数在
@NgModule
providers: [
{
provide: MSAL_INSTANCE,
useFactory: MSALInstanceFactory,
}
解决方案
Angular 提供了如何管理特定环境变量的解决方案。
您在environments
某处有一个文件夹,其中包含 2 个文件。您可以在此处指定此类导入。根据您的文件,如果您的环境发生变化( Angular Docs),angular.json
这些将自动交换。
所以这是你写它的地方:
// environment.ts
export const environment = {
"configuration": {
"redirectUri": "https://SomeWebSiteName-D.domainname.com",
"postLogoutRedirectUri": " https://SomeWebSiteName-D.domainname.com "
},
"apiBaseUrl": "https://SomeWebSiteNameAPI-D.domainname.com/api/"
}
// environment.<specific_environment>.ts
export const environment = {
"configuration": {
"redirectUri": "different keys",
"postLogoutRedirectUri": "..."
},
...
}
// msal-instance.factory.ts
import {environment} from '../path/to/environment';
environment.configuration;
更新:根据您的要求在评论中提供示例
要在运行时更改环境,您有多种选择。我将在这里概述一个示例;
interface Environment {
configuration: {
redirectUri: string,
postLogoutRedirectUri: string,
},
apiBaseUrl: string;
}
const environments: Record<string, Environment> = {
production: {
"configuration": {
"redirectUri": "https://SomeWebSiteName-D.domainname.com",
"postLogoutRedirectUri": "https://SomeWebSiteName-D.domainname.com"
},
"apiBaseUrl": "https://SomeWebSiteNameAPI-D.domainname.com/api/"
}
}
export let environment: Environment;
export const updateEnvironment = (env: string) => {
environment = environments[env];
}
// 'production' may be an environment variable instead of directly being a string
updateEnvironment('production');
推荐阅读
- data-science - 如何查看通过 ANOVA 测试选择的输入特征的名称?
- linux - 我可以在云/容器上存储和访问任何临时存储吗?
- nuget - 在nuget中为公共路径创建变量
- javascript - 如何在 Cypress 中创建有效的断言与 JSON 结构?
- php - 使用php批量加载到天蓝色
- mysql - 如何通过客户端编码而不是更改 my.ini 来更改 character_set_client 和 character_set_results
- list - 在两个列表中查找最小成对积
- reactjs - useState 挂钩的意外行为
- xml - 如何第二次停止执行“何时”条件
- c - 为什么我们使用函数指针结构?