public async Task <ApiResponse <AccessTokenModel> > OAuthByFacebook(string fbShortToken) { var client = GetFacebookClient(fbShortToken); object userModelResponse = null; try { userModelResponse = await client.GetTaskAsync("me", new { fields = new[] { "id", "name", "email", "birthday", "picture", "locale", "first_name", "last_name" } }); } catch (Exception e) { } var uModel = FacebookParser.Parse <FacebookUserProfileModel>(userModelResponse); if (uModel == null) { return(Failed()); } var dbUser = await _userStore.FindByEmailAsync(uModel.Email.ToLower()); if (dbUser == null) { dbUser = new EntityUser { UserName = uModel.Email, FirstName = uModel.FirstName, LastName = uModel.LastName, Email = uModel.Email, PictureUrl = uModel.Picture.Data.Url, Birthday = uModel.Birthday, Locale = uModel.Locale, EmailConfirmed = true, NormalizedEmail = uModel.Email.ToLower(), NormalizedUserName = uModel.Email.ToLower() }; await _userStore.CreateAsync(dbUser); await _userStore.AddToRoleAsync(dbUser, "user"); } var dbSocial = await _context.UserSocials.FirstOrDefaultAsync(x => x.UserId == dbUser.Id && x.Type == EntityUserSocialType.Facebook && x.ExternalId == uModel.Id); if (dbSocial == null) { dbSocial = new EntityUserSocial { ExternalId = uModel.Id, Type = EntityUserSocialType.Facebook, UserId = dbUser.Id, }; await _context.UserSocials.AddAsync(dbSocial); await _context.SaveChangesAsync(); } // get long live token using (HttpClient http = new HttpClient()) { var longTokenResponse = await http.GetAsync($"https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id=" + _appData.FacebookAppId + "&client_secret=" + _appData.FacebookAppSecret + "&fb_exchange_token=" + fbShortToken); if (!longTokenResponse.IsSuccessStatusCode) { return(Failed()); } var longTokenResponseContent = await longTokenResponse.Content.ReadAsStringAsync(); var facebookToken = JsonConvert.DeserializeObject <FacebookAccessTokenModel>(longTokenResponseContent); if (facebookToken == null) { return(Failed()); } dbSocial.Token = facebookToken.AccessToken; dbSocial.TokenExpires = DateTime.UtcNow.AddSeconds(facebookToken.ExpiresIn); _context.UserSocials.Update(dbSocial); await _context.SaveChangesAsync(); } var token = await AuthUser(dbUser, EntityUserSocialType.Facebook); return(Ok(token)); }