2017-11-21 1 views
0

Nachdem ich Antworten auf this SO question erhalten habe, erkannte ich, dass ich ein Domain-übergreifendes Problem mit dem httponly Flag ServiceStack BearerToken Cookie nicht an meine Ressource Microservices auf verschiedenen Domänen gesendet.Verwenden Sie die JWT-Token über mehrere Domänen mit Typescript JsonServiceClient - ServiceStack

In der Dokumentation von ServiceStack wird erläutert, wie dieses Problem in der Dokumentation here gelöst wird.

Ich habe Probleme beim Implementieren einer Typoskript-Version des Codebeispiels in der Dokumentation von ServiceStack. Ich nehme an, dass der Beispielcode in der Dokumentation C# ist.

Hier ist mein Typoskript Code mit Kommentaren:

import { JsonServiceClient, IReturn } from 'servicestack-client'; 
import { AuthService } from './auth.service'; 
//dtos generated by myauthservice/types 
import { GetAccessToken, ConvertSessionToToken, ConvertSessionToTokenResponse } from './dtos' 
import { AppModule } from '../../app.module'; 
import { Router } from '@angular/router'; 

export class JsonServiceClientAuth extends JsonServiceClient { 

    private router: Router; 
    private authClient: JsonServiceClient; 

    constructor(baseUrl: string) { 
     console.log('JsonServiceClientAuth.baseUrl', baseUrl); 
     super(baseUrl); 
     //Router is not injected via the contructor because clients of JsonServiceClientAuth need to create instances of it 
     this.router = AppModule.injector.get(Router); 
     this.authClient = new JsonServiceClient("http://localhost:5006"); 

     this.onAuthenticationRequired = async() => { 
      console.log('JsonServiceClientAuth.onAuthenticationRequired()'); 
      console.log('An API is not receiving the bearerToken being redirected to Login'); 
      this.router.navigate(['/login']); 
     }; 
    } 

    get<T>(request: IReturn<T> | string, args?: any): Promise<T> { 
     return new Promise<T>((resolve, reject) => { 

      //cross domain issue here, ss-tok httponly Cookie will not be sent to the Resource Service 
      //ConvertSessionToToken per Service Stacks documentation: http://docs.servicestack.net/jwt-authprovider#converting-an-existing-authenticated-session-into-a-jwt-token 

      //but send expects 2-4 argumments, one being the method name 
      //the Typecript send will not use the dto ConvertSessionToToken request and get the url 
      //var tokenResponse = this.send(new ConvertSessionToToken()) 

      console.log('this.bearToken', this.bearerToken); //undefined 
      //so try JsonServiceClient.get 
      this.authClient.get(new ConvertSessionToToken()) 
       .then(res => { 
        console.log('ConvertSessionToToken.res', res); 
        console.log('this.bearToken', this.bearerToken); //undefined 
        //next problem there is no function getTokenCookie in Typescript that I can find, not in the dtos and not in JsonServiceClient 
        //var jwtToken = this.getTokenCookie(); //From ss-tok Cookie 

        //maybe this will work? 
        //super.setBearerToken(this.bearerToken) 
        super.get(request).then(res => { 
         console.log('suger.get.res', res); 
         resolve(res); 
        }, msg => { 
         console.log('suger.get.msg', res); 
         reject(msg) 
        }) 
        .catch(ex => { 
         console.log('suger.get.ex', ex); 
         reject(ex); 
        }); 
       }, msg => { 
        console.log('ConvertSessionToToken.msg', msg); 
        reject(msg); 
       }) 
       .catch(ex =>{ 
        console.log('ConvertSessionToToken.ex', ex); 
        reject(ex); 
       }); 
     }); 
    } 

} 

Antwort

0

Warum sind Sie eine benutzerdefinierte JsonServiceClient implementieren? Verwenden Sie einfach die vorhandenen Eigenschaften bearerToken und refreshToken für die vorhandene JsonServiceClient, die bereits integrierte Unterstützung für das Senden von JWT-Bearer-Tokens und das Verwenden von Refresh-Tokens zum erneuten Abrufen von abgelaufenen JWT-Tokens bietet.

Sie können client.auth.spec.ts für Beispiele des unterstützten Verhaltens auschecken.

+0

Ich habe alle diese Testmethoden in client.auth.spec.ts durchgesehen, ich habe Cross-Domain-Ressourcen-APIs, so dass JsonServiceClient-Anfragen SS-Tok nicht enthalten. Ich habe kein refreshToken, weil ich eine benutzerdefinierte Legacy-Datenbank verwende und ich kann nicht auf das httponly ss-tok mit Javascript zugreifen. Ich weiß nicht, wie ich einen autorisierten Aufruf an eine domainübergreifende Ressource API für einen Benutzer, der bereits authentifiziert ist, vornehmen kann. In einigen der client.auth.spec.ts Tests erstellen Sie entweder jwt basierend auf Mock userAuthId, E-Mail oder Sie haben einen Benutzernamen/Passwort zu autorisieren, ich habe bereits einen BearerToken, der Benutzer hat sich eingeloggt –

+0

Sie sagten "Sie muss den BearerToken auf dem Service Client explizit setzen, damit meine domänenübergreifenden Ressourcenanforderungen funktionieren, also implementiere ich einen benutzerdefinierten JsonServiceClient, um diese Implementierungsdetails aus Bereichen meiner App auszublenden, die JsonServiceClient verwenden –

+0

Siehe meine [aktualisierte Antwort mit dem neuen IUserSessionSource] (https://Stackoverflow.com/a/47403514/85785), mit der Sie RefreshTokens ohne AuthRepository verwenden können. Aber das hat nichts damit zu tun, Sie können die JWT nicht in einem Token-Cookie über Domains hinweg verwenden, aber Sie können die 'bearerToken'-Eigenschaft verwenden, die das Token über den Autorisierungs-HTTP-Header sendet. Setzen Sie also nicht 'UseTokenCookie = true', dann [greifen Sie auf den BearerToken von der AuthenticateResponse zu] (http://docs.servicestack.net/jwt-authprovider#retrieve-token-with-api-key) und verwenden Sie ihn zum Auffüllen verschiedene 'JsonServiceClient'-Instanz. – mythz

Verwandte Themen