Estoy usando la plantilla Web Api 2 que viene con Visual Studio 2013 y tiene algún middleware OWIN para realizar la autenticación de usuario y similares.
En el OAuthAuthorizationServerOptions
noté que el servidor OAuth2 está configurado para distribuir tokens que caducan en 14 días
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(PublicClientId,UserManagerFactory) ,
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
Esto no es adecuado para mi último proyecto. Me gustaría entregar bearer_tokens de corta duración que se pueden actualizar usando unrefresh_token
He hecho muchas búsquedas en Google y no encuentro nada útil.
Así que esto es lo lejos que he logrado llegar. Ahora he llegado al punto de "WTF do I now".
He escrito un RefreshTokenProvider
que se implementa IAuthenticationTokenProvider
según la RefreshTokenProvider
propiedad en la OAuthAuthorizationServerOptions
clase:
public class SimpleRefreshTokenProvider : IAuthenticationTokenProvider
{
private static ConcurrentDictionary<string, AuthenticationTicket> _refreshTokens = new ConcurrentDictionary<string, AuthenticationTicket>();
public async Task CreateAsync(AuthenticationTokenCreateContext context)
{
var guid = Guid.NewGuid().ToString();
_refreshTokens.TryAdd(guid, context.Ticket);
// hash??
context.SetToken(guid);
}
public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
AuthenticationTicket ticket;
if (_refreshTokens.TryRemove(context.Token, out ticket))
{
context.SetTicket(ticket);
}
}
public void Create(AuthenticationTokenCreateContext context)
{
throw new NotImplementedException();
}
public void Receive(AuthenticationTokenReceiveContext context)
{
throw new NotImplementedException();
}
}
// Now in my Startup.Auth.cs
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(PublicClientId,UserManagerFactory) ,
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(2),
AllowInsecureHttp = true,
RefreshTokenProvider = new RefreshTokenProvider() // This is my test
};
Entonces, cuando alguien solicita un bearer_token
, ahora estoy enviando un refresh_token
, lo cual es genial.
Entonces, ¿cómo uso este refresh_token para obtener un nuevo bearer_token
, presumiblemente necesito enviar una solicitud a mi punto final de token con algunos encabezados HTTP específicos configurados?
Solo pienso en voz alta mientras escribo ... ¿Debo manejar la expiración de refresh_token en mi SimpleRefreshTokenProvider
? ¿Cómo obtendría un cliente uno nuevo refresh_token
?
Realmente me vendría bien algún material de lectura / documentación porque no quiero equivocarme y me gustaría seguir algún tipo de estándar.