[keycloak-dev] refactor angular2-product-app
Stan Silvert
ssilvert at redhat.com
Fri Feb 10 08:29:39 EST 2017
Thanks Tair. I'll be looking into this very soon. Probably next week.
On 2/9/2017 6:19 PM, Tair Sabirgaliev wrote:
> 1. The KeycloakHttp implementation overrides all the http methods, but
> in the
> Http class they all forward to 'request(...)' method, so overriding
> `request(...)` should be enough.
>
> 2. It is not obvious why the implementation uses Observable.merge.
> AFAICT the idea is to:
>
> (1) obtain the token (and update it BTW),
> (2) put it in header,
> (3) forward to superclass implementation.
>
> So we found that the whole KeycloakHttp implementation could be
> reduced to the following:
>
> @Injectable()
> export class KeycloakHttp extends Http {
> constructor(_backend: ConnectionBackend, _defaultOptions:
> RequestOptions, _keycloakService: KeycloakService) {
> super(_backend, _defaultOptions);
> }
>
> request(url: string | Request, options?: RequestOptionsArgs):
> Observable<Response> {
> const tokenPromise: Promise<string> =
> this._keycloakService.getToken();
> const tokenObservable: Observable<string> =
> Observable.fromPromise(tokenPromise);
>
> if (typeof url === 'string') {
> return tokenObservable.map(token => {
> const authOptions = new RequestOptions({
> headers: new Headers({'Authorization': 'Bearer ' +
> token})
> });
> return new
> RequestOptions().merge(options).merge(authOptions);
> }).concatMap(opts => super.request(url, opts));
> } else if (url instanceof Request) {
> return tokenObservable.map(token => {
> url.headers.set('Authorization', 'Bearer ' + token);
> return url;
> }).concatMap(request => super.request(request));
> }
> }
>
> }
>
More information about the keycloak-dev
mailing list