Я создал приложение WebApi и приложение для Кордовы. Я использую http-запросы для связи между приложением Cordova и WebApi. В WebApi я реализовал генерацию токенов-носителей 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());
}
и это находится внутри реализации SimpleAuthorizationServerProvider
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);
}
после успешного входа в API из приложения Cordova, я получаю следующий JSON
{"access_token":"some token","token_type":"bearer","expires_in":86399}
Проблема заключается в том, что мне требуется дополнительная информация о пользователе. Например, у меня есть поле UserGuid в базе данных, и я хочу отправить его в приложение Cordova, когда логин будет успешным, и использовать его позже в других запросах. Могу ли я включить другую информацию для возврата клиенту, кроме "access_token", "token_type"
и "expires_in"
? Если нет, как я могу получить пользователя в API на основе access_token
?
EDIT:
Я думаю, что нашел обходное решение.
Я добавил следующий код внутри GrantResourceOwnerCredentials
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserGuid.ToString()));
и после этого я обращаюсь к указателю внутри моего контроллера следующим образом: User.Identity.Name
Я также могу добавить guid с пользовательским именем identity.AddClaim(new Claim("guid", user.UserGuid.ToString()));
Мне все еще интересно узнать, есть ли способ вернуть больше данных клиенту с маркером-носителем JSON.