[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