У меня есть приложение Angular, которое проходит аутентификацию в Windows ADFS 2016 с использованием Open Id Connect. Приложение извлекает токен доступа и идентификатор токена через неявный поток и работает нормально. Проблема возникает, когда я пытаюсь обновить sh токен с помощью silentRefre sh (), как описано в документации: https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/refreshing-a-token.html
Это конфигурация:
const authConfig: AuthConfig = {
issuer: <address to adfs>,
redirectUri: window.location.origin+'/index.html',
silentRefreshRedirectUri: window.location.origin + '/silent-refresh.html',
clientId: '<client-id>',
scope: 'openid email profile',
logoutUrl: window.location.origin+'/logout',
tokenEndpoint: '<adfs address>/adfs/oauth2/token',
loginUrl: '<adfs address>/adfs/oauth2/authorize',
strictDiscoveryDocumentValidation: false,
skipIssuerCheck: true,
oidc: true
};
Конфигурация OAuth
private configureOauth(){
this.oauthService.configure(authConfig);
this.oauthService.tokenValidationHandler = new JwksValidationHandler();
this.oauthService.setStorage(sessionStorage);
this.oauthService.setupAutomaticSilentRefresh({});
this.oauthService.tryLogin({onTokenReceived: context => {
// tslint:disable-next-line:no-console
console.debug('logged in');
// tslint:disable-next-line:no-console
console.info( this.oauthService.getAccessToken() );
// tslint:disable-next-line:no-console
console.info( this.oauthService.getIdToken() );
}});
}
Чтобы обновить sh токен, который я вызываю
public triggerSilentRefresh(){
this
.oauthService
.silentRefresh()
.then(info => console.debug('refresh ok', info))
.catch(err => console.error('refresh error', err));
}
Но я получаю следующую ошибку:
core.js:6014 ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'responseType' of null
TypeError: Cannot read property 'responseType' of null
at OAuthService.<anonymous> (angular-oauth2-oidc.js:1826)
at Generator.next (<anonymous>)
This createLoginUrl выбрасывается, потому что AuthConfig имеет значение null.
createLoginUrl(state = '', loginHint = '', customRedirectUri = '', noPrompt = false, params = {}) {
return __awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const that = this;
/** @type {?} */
let redirectUri;
if (customRedirectUri) {
redirectUri = customRedirectUri;
}
else {
redirectUri = this.redirectUri;
}
/** @type {?} */
const nonce = yield this.createAndSaveNonce();
if (state) {
state = nonce + this.config.nonceStateSeparator + state;
}
else {
state = nonce;
}
if (!this.requestAccessToken && !this.oidc) {
throw new Error('Either requestAccessToken or oidc or both must be true');
}
if (this.config.responseType) { //HERE config is null
this.responseType = this.config.responseType;
Я не понимаю, как может быть нулевым, если он был инициализирован, и я успешно получил свой токен доступа. Я что-то не так делаю или пропустил в конфигурации?