typescript - RefreshToken je po úspešnej autentifikácii ServiceStack undefined


  • ServiceStack Verzia 5.0
  • ServiceStack Typescript Klient Verzia 0.0.40

Nasledujúci kód volá môj Auth mikroslužbu, úspešne autentifikuje používateľa a vráti jeho bearer token:

var request = new Authenticate();
request.provider = "credentials";
request.userName = userName;
request.password = password;
request.useTokenCookie = true;

this.client.post(request)
.then(res => {
    if (res.bearerToken != null) {
    console.log('auth success', res);
    console.log('auth refresh token', res.refreshToken);
    resolve(true);
    }
    resolve(false);
}, msg => {
    console.log('log in failed');
    reject(msg);
})

Problém je v tom, že moja autentifikačná mikroslužba nevracia žiadny obnovovací token:

Moja konfigurácia pre môj Auth mikroslužbu:

Plugins.Add(new AuthFeature(() => new CustomUserSession(),
    new IAuthProvider[] {
        new JwtAuthProvider
        {
            HashAlgorithm = AuthSettings.HashAlgorithm,
            RequireSecureConnection = requireSecureConnection,
            AuthKeyBase64 = AuthSettings.JwtAuthKeyBase64,
            ExpireTokensIn        = TimeSpan.FromHours(_configuration["AuthSettings:ExpireTokensIn"].ToDouble()),
            ExpireRefreshTokensIn = TimeSpan.FromHours(_configuration["AuthSettings:ExpireRefreshTokensIn"].ToDouble()),
            CreatePayloadFilter = (payload,session) => {
                    payload["zipCode"] = ((CustomUserSession)session).ZipCode;
            },
            PopulateSessionFilter = AuthSettings.PopulateSessionFilterImplementation
        },
        new CustomCredentialsAuthProvider((ITsoContext)_serviceProvider.GetService(typeof(ITsoContext))) //HTML Form post of User/Pass
    }));

Odpoveď č. 1

Ak prepisujete CredentialsAuthProvider vlastným AuthProviderom, uistite sa, že tiež nastavujete, že autentifikácia bola vykonaná s:

authService.Request.Items[Keywords.DidAuthenticate] = true;

Podpora pre JWT RefreshTokens tiež vyžaduje registrované AuthRepository.

Ak používate vlastného poskytovateľa overovania (Custom AuthProvider) bez IAuthRepository, práve som pridal podporu pre implementáciu IUserSessionSource ako alternatívneho zdroja na napĺňanie relácií (Sessions) v nových JWT tokenoch, ktorú môžete využiť registráciou v vašom IOC alebo tým, že váš vlastný poskytovateľ overovania implementuje:

public interface IUserSessionSource
{
    IAuthSession GetUserSession(string userAuthId);
}

Implementácia by mala vrátiť naplnený IAuthSession iba vtedy, ak je povolené sa prihlásiť, t.j. ak je ich účet pozastavený, mala by vyhodiť výnimku ako:

throw HttpError.Forbidden("User is suspended");

Podpora pre IUserSessionSource je dostupná od ServiceStack v5, ktorá je teraz k dispozícii na MyGet. Pred aktualizáciou si prosím preštudujte zmeny vo verzii v5.