Для проекта я использую эту библиотеку: angular-oauth2-oidc для поддержки в OAuth 2 и OpenId Connect (OIDC) в Angular.
У меня все настроено и все работает нормально.
Файл MainComponent:
export class MainComponent implements OnInit {
constructor() {
this.configureSSO();
}
configureSSO() {
this.oAuthService.configure(authConfig);
this.oAuthService.tokenValidationHandler = new JwksValidationHandler();
this.oAuthService.loadDiscoveryDocumentAndTryLogin().then(() => {
// the lib received the access_token as well as the id_token, if it was requested.
// If there is an id_token, the lib validated it.
// DO STUFF WITH TOKEN HERE
});
}
}
Файл authConfig:
import {AuthConfig} from 'angular-oauth2-oidc';
export const authConfig: AuthConfig = { /...SOME CONFIG HERE .../ }
Файл AuthGuard:
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router, private oAuthService: OAuthService) {
}
canActivate(): boolean {
if(this.oAuthService.hasValidIdToken()){
return true;
}
return false;
}
}
После успешного входа на сайт поставщиков OIDC я вижу, что access_token сохраняется в хранилище сеансов моего локального браузера:
Все это работает отлично, НО, если я теперь перейду к изменению токена в хранилище сеансов, я все еще смогу попасть в свои защищенные маршруты. Хотя access_token
был переделан. То же самое при изменении id_token
.
-> AuthGuard по-прежнему позволяет мне переходить на мои защищенные маршруты.
Может ли кто-нибудь просветить меня, как это возможно?
Я не могу найти ничего о том, как это делается внутри, в документации angular-oauth2-oidc
Я совершенно уверен, что это НЕ ошибка реализации, а скорее то, что библиотека сохраняет токен где-то внутри и вместо этого использует неизмененный токен, так как все остальное работает, как ожидалось, отлично.
Но ПОЧЕМУ все равно сохранять токен в хранилище сеансов, если он (на самом деле) не используется?!?
Более:
Если я на самом деле удалю весь токен из хранилища, все заблокированные маршруты будут заблокированы - это хорошо :)! То же самое происходит, когда я изменяю время истечения срока действия (exp) внутри JWT на что-то до фактического времени. Итак, эти две проверки на самом деле работают нормально, но при изменении access_token
или id_token
AuthGuard по-прежнему получает действительный токен ... (может быть, изнутри библиотеки?!?)
Я думаю, что есть кое-что, чего я не понимаю в JWT в целом, и почему они даже сохраняются в локальном / сессионном хранилище, или почему их изменение не имеет никакого эффекта ...
Любые ответы приветствуются.