«В настройках нет прав доступа» - Angular 7, oidc-клиент - PullRequest
0 голосов
/ 22 марта 2019

Я не знаю, является ли это oidc или Angular, или и тем, и другим. Различные представления одного и того же строкового значения приводят к тому, что полномочия не распознаются:

Работает, если я ввожу значение напрямую:

authority: 'http://my.url.com'
// no errors

Не работает получение значения от услуги:

authority: this.settingsService.settings.stsAuthority
// MetadataService.getMetadata: No authority or metadataUrl configured on settings.
// console.log(this.settingsService.settings.stsAuthority) => 'http://my.url.com'
// console.log(typeof(this.settingsService.settings.stsAuthority)) => string

Работает получение значения из другого класса в другом файле:

authority: Constants.stsAuthority
---
export class Constants {
    stsAuthority = 'http://my.url.com';
}

// no errors
// console.log(Constants.stsAuthority) => 'http://my.url.com'
// console.log(typeof(Constants.stsAuthority)) => string

Не работает получение значения из другого класса в другом файле, ЕСЛИ ФАЙЛ использует значение службы:

authority: Constants.stsAuthority
---
export class Constants {
    stsAuthority = this.settingsService.settings.stsAuthority;
}
    // MetadataService.getMetadata: No authority or metadataUrl configured on settings.

Использование замены строки в значении службы становится неопределенным, но не вызывает ошибок:

authority: Constants.stsAuthority
---
export class Constants {
    stsAuthority = `${this.settingsService.settings.stsAuthority}`;
}
    // GET https://rootUrl/**undefined**/.well-known/openid-configuration 404

Теперь вы думаете: «Что-то не так с сервисом!» Но каждый раз, когда я регистрирую значение сервиса, я получаю правильное значение. Вот сервисный код, который доставляет значения URL:

@Injectable({
    providedIn: 'root'
})

export class SettingsService {
    public settings: Settings;

    constructor() { 
        this.settings = new Settings();
    }

}

Это еще одна служба APP_INITIALIZER, которая получает значения настроек из среды:

settings.http.service.ts

@Injectable({
    providedIn: "root"
})
export class SettingsHttpService {

    constructor(private http: HttpClient, private settingsService: SettingsService) { }

    initializeApp(): Promise<any> {

        return new Promise(
            (resolve) => {
                this.http.get('assets/settings.json')
                    .toPromise()
                    .then(response => {
                        this.settingsService.settings = <Settings>response;
                        resolve();
                    })
            }
        );
    }
}

Вот каков результат и вот что возвращает settings.service:

{
    "clientRoot": "http://my.url.com",
}
...