Retorne mais informações ao cliente usando o OAuth Bearer Tokens Generation e Owin no WebApi
Eu criei um aplicativo WebApi e um Cordova. Estou usando solicitações HTTP para se comunicar entre o aplicativo Cordova e a WebAPI. Na WebAPI, implementei a geração de token de portador OAuth.
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());
}
e isso é dentro doSimpleAuthorizationServerProvider
implementação
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);
}
depois de uma solicitação de login bem-sucedida à API do aplicativo Cordova, recebo o seguinte JSON
{"access_token":"some token","token_type":"bearer","expires_in":86399}
O problema é que eu preciso de mais informações sobre o usuário. Por exemplo, eu tenho um campo UserGuid no banco de dados e desejo enviá-lo para o aplicativo Cordova quando o logon for bem-sucedido e usá-lo posteriormente em outras solicitações. Posso incluir outras informações para retornar ao cliente, exceto"access_token", "token_type"
e"expires_in"
? Caso contrário, como posso obter o usuário na API com base noaccess_token
?
EDITAR:
Eu acho que encontrei uma solução alternativa. Eu adicionei o seguinte código dentroGrantResourceOwnerCredentials
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserGuid.ToString()));
e depois disso, eu acesso o GUID dentro do meu controlador assim:User.Identity.Name
Também posso adicionar o guid com um nome personalizadoidentity.AddClaim(new Claim("guid", user.UserGuid.ToString()));
Ainda estou interessado em saber se existe uma maneira de retornar mais dados ao cliente com o JSON do token de portador.