public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { var userManager = context.OwinContext.GetUserManager <ApplicationUserManager>(); var user = await userManager.FindAsync(context.UserName, context.Password); if (user == null) { context.SetError("invalid_grant", "incorrect_user_pass"); return; } if (!user.SmsSent) { context.SetError("invalid_grant", "please register first."); return; } user.IsLogin = true; var isLoginUpdated = await userManager.UpdateAsync(user); if (!isLoginUpdated.Succeeded) { context.SetError("internal_error", "An error has occurred."); return; } try { var data = await context.Request.ReadFormAsync(); if (data["deviceId"] != null) { var deviceId = data["deviceId"].ToString(); var registerationId = data["registerationId"].ToString(); if (string.IsNullOrEmpty(user.NotificationKey)) { var notificationKey = Firebase.CreateFirebaseGroup("U-" + user.Id, registerationId); user.NotificationKey = notificationKey; var notificationKeyUpdated = await userManager.UpdateAsync(user); if (!notificationKeyUpdated.Succeeded) { context.SetError("internal_error", "An error has occurred."); return; } } else { Firebase.AddToFirebaseGroup("U-" + user.Id, user.NotificationKey, registerationId); } var oldRegisterId = SetLoginRegisterationId(user.Id, deviceId, registerationId); if (!string.IsNullOrEmpty(oldRegisterId) && oldRegisterId != registerationId) { Firebase.RemoveFromFireBase("U-" + user.Id, user.NotificationKey, new string[] { oldRegisterId }); } } else { context.SetError("internal_error", "call setDevice before login."); return; } } catch (Exception ex) { context.SetError("firebase_error", ex.Message); } var oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); var cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType); var properties = CreateProperties(user.Id); var ticket = new AuthenticationTicket(oAuthIdentity, properties); context.Validated(ticket); context.Request.Context.Authentication.SignIn(cookiesIdentity); }