typescript - RefreshToken indefinido después de la autenticación exitosa en ServiceStack
- ServiceStack Versión 5.0
- Cliente TypeScript de ServiceStack Versión 0.0.40
El siguiente código llama a mi microservicio de autenticación y autentica con éxito a un usuario, devolviendo su token de portador:
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);
})
El problema es que no hay un token de actualización devuelto por mi microservicio de autenticación:
Mi configuración para mi Microservicio de Autenticación:
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
}));
Respuesta #1
Si estás sobrescribiendo CredentialsAuthProvider con un AuthProvider personalizado, asegúrate también de establecer que la autenticación se realizó con:
authService.Request.Items[Keywords.DidAuthenticate] = true;
El soporte para JWT RefreshTokens también requiere un AuthRepository registrado.
Si estás usando un AuthProvider personalizado sin un IAuthRepository, acabo de añadir soporte para implementar IUserSessionSource como una fuente alternativa para poblar las sesiones en nuevos tokens JWT, lo cual puedes utilizar registrándolo en tu IOC o haciendo que tu AuthProvider personalizado implemente:
public interface IUserSessionSource
{
IAuthSession GetUserSession(string userAuthId);
}
La implementación solo debería devolver un IAuthSession poblado si tienen permitido iniciar sesión, es decir, si su cuenta está suspendida debería lanzar una Excepción como:
throw HttpError.Forbidden("User is suspended");
El soporte para IUserSessionSource está disponible a partir de ServiceStack v5, que ya está disponible en MyGet. Por favor, revise los cambios de la versión v5 antes de actualizar.
