在调用 Angular 构造函数之前捕获查询字符串
Posted
技术标签:
【中文标题】在调用 Angular 构造函数之前捕获查询字符串【英文标题】:Capturing query string before Angular Constructor is called 【发布时间】:2020-12-21 18:06:54 【问题描述】:我正在使用第三方工具 (Strapi) 通过 MSAL 进行身份验证。
-
打开 Angular 网站
重定向到 Microsoft 登录
使用有效令牌重定向回 Angular 应用程序。
在第 2 步和第 3 步之间,有一个来自 Strapi 的单独访问令牌作为 url 中的查询字符串,我需要将其发送回 Strapi 以便从中获取令牌。此令牌旨在授予对 CMS 的访问权限。其目的是将 Strapi 用作 Microsoft 的 SSO 提供程序,以便同时访问 MSAL 和 Strapi。
我从 Strapi 获得的访问令牌是有效的,但问题是一旦 Angular 应用程序初始化,url 中的查询字符串就会丢失(仅显示一秒钟,但可以在“网络”选项卡中进行验证)。所以通常你可以在构造函数中捕获查询字符串,我无法捕获它,因为它在构造函数被调用之前就消失了。
我不确定如何保存此值,以便将其发送到需要的地方。
以下是我尝试过的两个示例,但由于上述原因而没有奏效。
constructor(
public mediaObserver: MediaObserver,
private router: Router,
private authService: MsalService,
private broadcastService: BroadcastService,
private apibundleService: ApibundleService,
private permissionsService: NgxPermissionsService,
private http: HttpClient,
private route: ActivatedRoute
)
this.route.queryParams.subscribe((params) =>
this.queryAccessToken = params['access_token'];
console.log(this.queryAccessToken);
);
constructor(
public mediaObserver: MediaObserver,
private router: Router,
private authService: MsalService,
private broadcastService: BroadcastService,
private apibundleService: ApibundleService,
private permissionsService: NgxPermissionsService,
private http: HttpClient,
private route: ActivatedRoute
)
this.route.fragment
.pipe(map(fragment => fragment))
.subscribe(fragment =>
let f = fragment.match(/^(.*?)&/);
if(f)
let token: string = f[1].replace('access_token=', '');
)
【问题讨论】:
“url中的查询字符串丢失”。您的路由器配置中有重定向路由吗? 是的,我有一个基本的通配符重定向设置为 path: '**', redirectTo: ''。当访问令牌传递时,它像这样 localhost:4200/?access_token=12345 进来。 删除通配符重定向后会发生什么? 我取出了所有重定向并再次尝试了身份验证。看起来行为是一样的。在 1-2 秒内,带有访问令牌的 url 就像 localhost:4200/?access_token=12345 一样。然后它重定向回根页面。我怀疑在重定向发生之前 Angular 甚至还没有初始化,但我不确定。 你可以监视router events。也许这样你就可以确定发生了什么以及为什么。使用enableTracing
option。
【参考方案1】:
在这里创建了一个问题。 https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/3242
在 1.4.2 中已经解决了。请更新库。
【讨论】:
以上是关于在调用 Angular 构造函数之前捕获查询字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Angular 2 中调用其构造函数之前将数据发送或绑定到子组件?
Bazel + Angular + SocketIO 原因:未捕获的 TypeError:XMLHttpRequest 不是构造函数
ERROR 错误:未捕获(承诺中):TypeError:i.BehaviorSubject 不是 Angular 10 s-s-r 中的构造函数