コード例 #1
0
        public async Task <ActionResult <LoginResponseDto> > ConfirmSocialLogin([FromBody] SocialLoginDto model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            var user = await _userService.GetUserByEmail(model.Email);

            if (user != null)
            {
                var token       = GenerateToken(user.User);
                var loginResult = new LoginResponseDto();
                loginResult.Token                = new JwtSecurityTokenHandler().WriteToken(token);
                loginResult.User                 = user.User;
                loginResult.CreatedDebates       = user.CreatedDebates;
                loginResult.ParticipatingDebates = user.ParticipatingDebates;
                return(Ok(loginResult));
            }
            else
            {
                bool created = await _userService.Register(model.Email);

                if (!created)
                {
                    return(BadRequest("Unable to create user"));
                }
                user = await _userService.GetUserByEmail(model.Email);

                var token       = GenerateToken(user.User);
                var loginResult = new LoginResponseDto();
                loginResult.Token = new JwtSecurityTokenHandler().WriteToken(token);
                loginResult.User  = user.User;
                return(Created("/auth/social", loginResult));
            }
        }
コード例 #2
0
        public async Task <IActionResult> Apple(SocialLoginDto apple)
        {
            if (!ModelState.IsValid)
            {
                return(CustomResponse(ModelState));
            }

            var privateKey = System.IO.File.ReadAllText("path/to/file.p8");
            var provider   = new AppleAuthProvider("MyClientID", "MyTeamID", "MyKeyID", "https://myredirecturl.com/HandleResponseFromApple", "SomeState");

            var appleRefreshToken = await provider.GetRefreshToken(apple.AccessToken, privateKey);

            var user = await AuthenticationService.UserManager.FindByEmailAsync(appleRefreshToken.UserInformation.Email);

            if (user == null)
            {
                user = new User
                {
                    UserName = apple.UserName,
                    Email    = apple.Email
                };

                var result = await AuthenticationService.UserManager.CreateAsync(user, Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8));

                if (result.Succeeded)
                {
                    user = await AuthenticationService.UserManager.FindByEmailAsync(user.Email);

                    await AuthenticationService.SignInManager.SignInAsync(user, false);

                    var response = await AuthenticationService.GetUserLoginResponse(user);

                    return(CustomResponse(response));
                }

                foreach (var error in result.Errors)
                {
                    NotificateError(error.Description);
                }

                return(CustomResponse());
            }
            else
            {
                await AuthenticationService.SignInManager.SignInAsync(user, false);

                var response = await AuthenticationService.GetUserLoginResponse(user);

                return(CustomResponse(response));
            }
        }
コード例 #3
0
        public async Task <IActionResult> Facebook(SocialLoginDto facebook)
        {
            if (!ModelState.IsValid)
            {
                return(CustomResponse(ModelState));
            }

            // 1.generate an app access token
            var appAccessTokenResponse = await new HttpClient().GetStringAsync($"https://graph.facebook.com/oauth/access_token?client_id={FacebookAuthSettings.AppId}&client_secret={FacebookAuthSettings.AppSecret}&grant_type=client_credentials");
            var appAccessToken         = JsonConvert.DeserializeObject <FacebookAppAccessToken>(appAccessTokenResponse);
            // 2. validate the user access token
            var userAccessTokenValidationResponse = await new HttpClient().GetStringAsync($"https://graph.facebook.com/debug_token?input_token={facebook.AccessToken}&access_token={appAccessToken.AccessToken}");
            var userAccessTokenValidation         = JsonConvert.DeserializeObject <FacebookUserAccessTokenValidation>(userAccessTokenValidationResponse);

            if (!userAccessTokenValidation.Data.IsValid)
            {
                NotificateError("Token inválido.");
                return(CustomResponse());
            }

            // 3. we've got a valid token so we can request user data from fb
            var userInfoResponse = await new HttpClient().GetStringAsync($"https://graph.facebook.com/v10.0/me?fields=id,email,name,picture&access_token={facebook.AccessToken}");
            var userInfo         = JsonConvert.DeserializeObject <FacebookUserData>(userInfoResponse);

            // 4. ready to create the local user account (if necessary) and jwt
            var user = await AuthenticationService.UserManager.FindByEmailAsync(userInfo.Email);

            if (user == null)
            {
                user = new User
                {
                    UserName  = userInfo.Name,
                    Email     = userInfo.Email,
                    AvatarUrl = userInfo.Picture.Data.Url
                };

                var result = await AuthenticationService.UserManager.CreateAsync(user, Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8));

                if (result.Succeeded)
                {
                    user = await AuthenticationService.UserManager.FindByEmailAsync(user.Email);

                    await AuthenticationService.SignInManager.SignInAsync(user, false);

                    var response = await AuthenticationService.GetUserLoginResponse(user);

                    return(CustomResponse(response));
                }

                foreach (var error in result.Errors)
                {
                    NotificateError(error.Description);
                }

                return(CustomResponse());
            }
            else
            {
                await AuthenticationService.SignInManager.SignInAsync(user, false);

                var response = await AuthenticationService.GetUserLoginResponse(user);

                return(CustomResponse(response));
            }
        }