我使用angular-oauth2-oidc库在我的 AppComponent 中使用 PKCE 实现 oAuth 授权代码流。它工作正常,我什至可以传递一些自定义查询参数,我需要根据用户的语言和国家/地区更改从我的 oAuth 授权服务器收到的登录表单。
但只有当我将语言和国家硬编码到customQueryParams
我的oAuthService
. 所以这段代码有效:
export class AppComponent {
constructor(private oauthService: OAuthService) { }
ngOnInit() {
let authConfig: AuthConfig = {
issuer: 'https://myIssuerURL.com',
redirectUri: 'https://myRedirectURL.com',
clientId: environment.myClientId,
scope: 'openid',
responseType: 'code',
showDebugInformation: true,
};
this.oauthService.customQueryParams = { // this is the important part. I want to change the country and locale dynamically
'country': 'DE',
'locale': 'de_DE'
};
this.oauthService.tokenValidationHandler = new JwksValidationHandler();
this.oauthService.setupAutomaticSilentRefresh();
this.oauthService.loadDiscoveryDocumentAndTryLogin();
this.oauthService.events.subscribe(e => {
console.log("OAuthEvent: ", e)
if (e.type === "token_received") {
// This works, I get the access token and the IdentityClaims.
this.logger.log("The IdentityClaims are: ", this.oauthService.getIdentityClaims())
this.logger.log("The accessToken: ", this.oauthService.getAccessToken())
}
(e instanceof OAuthErrorEvent) ? this.logger.error(e) : this.logger.warn(e);
});
}
但是我需要从我的 URL 中动态检索国家和语言,然后将它们传递给 oAuthService,然后初始化代码流。但是现在当我想从 URL 中获取这些参数时,我遇到了问题。AppComponent 是一个非路由组件,因此我不能简单地使用paramMap.snapshot
. 所以我尝试了以下操作:
export class AppComponent {
constructor(private oauthService: OAuthService,
private route: ActivatedRoute,
private router: Router) { }
ngOnInit() {
this.router.events
.pipe(
filter(e => (e instanceof ActivationEnd) && (Object.keys(e.snapshot.params).length > 0)),
map(e => e instanceof ActivationEnd ? e.snapshot.params : {})
)
.subscribe(params => {
let authConfig: AuthConfig = {
issuer: 'https://myIssuerURL.com',
redirectUri: 'https://myRedirectURL.com',
clientId: environment.myClientId,
scope: 'openid',
responseType: 'code',
showDebugInformation: true,
};
this.oauthService.customQueryParams = { // this is the important part that doesn't work dynamically
'country': params.country,
'locale': params.locale
};
console.log(params.country) // DE
console.log(params.locale) // de_DE
this.oauthService.tokenValidationHandler = new JwksValidationHandler();
this.oauthService.setupAutomaticSilentRefresh();
this.oauthService.loadDiscoveryDocumentAndTryLogin();
this.oauthService.events.subscribe(e => {
// This doesn't work, I never get here.
console.log("OAuthEvent: ", e)
if (e.type === "token_received") {
// This doesn't work, I never get here.
this.logger.log("The IdentityClaims are: ", this.oauthService.getIdentityClaims())
this.logger.log("The accessToken: ", this.oauthService.getAccessToken())
}
(e instanceof OAuthErrorEvent) ? this.logger.error(e) : this.logger.warn(e);
});
}
尽管此方法可以从我的 URL 中正确检索country
and (正如我在and语句中看到的那样),但我在这里从未收到访问令牌或 identityClaims。locale
console.log(country)
console.log(locale)
我还尝试将我所有的 oAuthService 配置移动到 中LoginComponent
,因为在那里我通常可以使用 activateRoute 访问 URL 参数,然后使用参数配置 oAuthService。但这也不起作用,我也从未收到访问令牌或 IdentityClaims。我不明白这一点,是否不能oAuthService
在另一个组件中配置而不是在 中AppComponent
?在我发现的所有示例中,它都在 中进行了配置AppComponent
,但为什么呢?这是必须的吗?为什么当我在第一种方法的订阅部分配置它时它不起作用?
非常感谢。