在Angular项目中,我正在使用AWS Amplify处理身份验证。 现在,我想将其配置为使用cookie管理令牌。
阅读文档后,我发现需要在main.ts
中提供my own storage to Amplify。
因此,我安装了ngx-cookie
并开始在库方法和AWS Amplify签名之间进行映射,如下所示:
main.ts
class MyStorage {
constructor(private cookieService: CookieService) { }
setItem(key: string, value: string) {
this.cookieService.put(key, value);
}
getItem(key: string): string {
return this.cookieService.get(key);
}
}
Amplify.configure({
...amplify,
Auth: {
oauth: oauth,
cookieStorage: {
domain: 'localhost'
},
storage: new MyStorage(), <--- expect a cookieService here
}
});
问题:new MyStorage()
期望在参数中使用cookieService,并且似乎无法在main.ts
中添加构造函数。
问题:如何在main.ts
中传递服务?
感谢您的帮助。
答案 0 :(得分:1)
好吧,main.ts
是Angular应用程序的入口点。在这里,由于我们不在Angular应用程序之外,因此无法查询服务实例或将其注入。看来Storage
对象也已与Angular应用程序完全分离,因此您必须自己进行任何依赖注入。
还要注意:虽然我找不到任何明确的文档,但是Amazon的此Storage类的example的所有属性均为静态,因此我不确定配置是否期望实例完全是一个班级。
我曾经想过要劫持APP_INITIALIZER
以便在应用程序首次引导时获取DI令牌。但是,我对Amplify并不熟悉,因此我不知道何时需要配置,因此这可能会或可能不会起作用:
App.module.ts
providers: [
{
provide: APP_INITIALIZER,
useFactory: amplifyConfigFactory,
deps: [CookieService],
multi: true
}
]
amplifyConfigFactory.factory.ts
export function amplifyConfigFactory(cookieService: CookieService) {
Amplify.configure({
// ....
storage: new MyStorage(cookieService)
});
return () => Promise.resolve(); // factories must return a Promise
}
因此,我们的deps
条目上方被实例化并按顺序注入工厂,我们可以使用Injector中的MyStorage
创建一个cookieService
。
同样,如果MyStorage上的属性必须是静态的,那么您将需要一个不同的解决方案。在我看来,MyStorage
并不是Angular应用程序应该知道的,但是取决于是否需要在APP_INITIALIZER
钩子之前配置Amblify,这可能有效。