Devuelva más información al cliente utilizando OAuth Bearer Tokens Generation y Owin en WebApi
He creado una aplicación WebApi y una aplicación Cordova. Estoy usando solicitudes HTTP para comunicarme entre la aplicación Cordova y el WebAPI. En WebAPI, he implementado OAuth Bearer Token Generation.
public void ConfigureOAuth(IAppBuilder app)
{
var oAuthServerOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider(new UserService(new Repository<User>(new RabbitApiObjectContext()), new EncryptionService()))
};
// Token Generation
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
y esto está dentro delSimpleAuthorizationServerProvider
implementación
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
// A little hack. context.UserName contains the email
var user = await _userService.GetUserByEmailAndPassword(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "Wrong email or password.");
return;
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim("role", "user"));
context.Validated(identity);
}
después de una solicitud de inicio de sesión exitosa a la API desde la aplicación Cordova, recibo el siguiente JSON
{"access_token":"some token","token_type":"bearer","expires_in":86399}
El problema es que necesito más información sobre el usuario. Por ejemplo, tengo un campo UserGuid en la base de datos y quiero enviarlo a la aplicación Cordova cuando el inicio de sesión sea exitoso y usarlo más adelante en otras solicitudes. ¿Puedo incluir otra información para devolver al cliente, que no sea"access_token", "token_type"
y"expires_in"
? Si no, ¿cómo puedo obtener el usuario en la API en función de laaccess_token
?
EDITAR:
Creo que encontré una solución alternativa. Agregué el siguiente código dentroGrantResourceOwnerCredentials
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserGuid.ToString()));
y después de eso, accedo al GUID dentro de mi controlador de esta manera:User.Identity.Name
También puedo agregar el guid con un nombre personalizadoidentity.AddClaim(new Claim("guid", user.UserGuid.ToString()));
Todavía estoy interesado en saber si hay una manera de devolver más datos al cliente con el token portador JSON.