コード例 #1
0
        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));
        }