예제 #1
0
        public async Task <IActionResult> GetUserByLoginAsync([FromRoute] string userLogin,
                                                              CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (userLogin == null)
            {
                var error = ServiceErrorResponses.BodyIsMissing(userLogin);
                return(BadRequest(error));
            }

            User modelUser = null;

            try
            {
                modelUser = await repository.GetAsync(userLogin, cancellationToken).ConfigureAwait(false);
            }
            catch (UserNotFoundException)
            {
                var error = ServiceErrorResponses.UserNotFound(userLogin);
                return(NotFound(error));
            }

            var clientUser = UserConverter.Convert(modelUser);

            return(Ok(clientUser));
        }
예제 #2
0
        public async Task <IActionResult> GenerateToken([FromBody] Client.Models.Users.UserRegistrationInfo userInfo, [FromServices] IJwtSigningEncodingKey signingEncodingKey, CancellationToken cancellationToken)
        {
            if (userInfo == null)
            {
                var error = ServiceErrorResponses.BodyIsMissing("UserInfo");
                return(BadRequest(error));
            }

            if (userInfo.Login == null || userInfo.Password == null)
            {
                var error = ServiceErrorResponses.NotEnoughUserData();
                return(BadRequest(error));
            }

            User user;

            try
            {
                user = await users.GetAsync(userInfo.Login, cancellationToken);
            }
            catch (UserNotFoundException)
            {
                var error = ServiceErrorResponses.UserNotFound(userInfo.Login);
                return(BadRequest(error));
            }

            if (user.PasswordHash != Auth.AuthHash.GetHashPassword(userInfo.Password))
            {
                var error = ServiceErrorResponses.IncorrectPassword();
                return(BadRequest(error));
            }

            var clientUser = UserConverter.Convert(user);

            var claims = new Claim[]
            {
                new Claim(ClaimTypes.Name, clientUser.Login),

                new Claim(ClaimTypes.NameIdentifier, clientUser.Id),
            };

            var token = new JwtSecurityToken(
                //issuer: "ToDoTasksApp",
                //audience: "ToDoTasksClient",
                claims: claims,
                expires: DateTime.Now.AddMinutes(AuthOptions.LIFETIME),
                signingCredentials: new SigningCredentials(signingEncodingKey.GetKey(), signingEncodingKey.SigningAlgorithm)
                );

            var encodedJwt = new JwtSecurityTokenHandler().WriteToken(token);

            return(Ok(new AuthTokenAnswer
            {
                Login = userInfo.Login,

                AccessToken = encodedJwt
            }));
        }
예제 #3
0
        public async Task <IActionResult> RemoveTaskAsync([FromRoute] string taskId, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (!Guid.TryParse(taskId, out var modelToDoTaskId))
            {
                var error = ServiceErrorResponses.ToDoTaskNotFound(taskId);
                return(this.NotFound(error));
            }

            var userLoginRequest = this.HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Name);

            User user = null;

            try
            {
                user = await users.GetAsync(userLoginRequest.Value, cancellationToken);
            }
            catch
            {
                var error = ServiceErrorResponses.UserNotFound(userLoginRequest.Value);
                return(BadRequest(error));
            }

            ToDoTask modelTask = null;

            try
            {
                modelTask = await this.tasks.GetAsync(modelToDoTaskId, cancellationToken);
            }
            catch (ToDoTaskNotFoundException)
            {
                var error = ServiceErrorResponses.ToDoTaskNotFound(taskId);
                return(NotFound(error));
            }


            if (user.Id != modelTask.UserId)
            {
                var error = ServiceErrorResponses.AccessDenied();
                return(StatusCode(StatusCodes.Status403Forbidden, error));
            }

            try
            {
                await tasks.RemoveAsync(modelToDoTaskId, cancellationToken);
            }
            catch (ToDoTaskNotFoundException)
            {
                var error = ServiceErrorResponses.ToDoTaskNotFound(taskId);
                return(NotFound(error));
            }

            return(NoContent());
        }
예제 #4
0
        public async Task <IActionResult> GenerateToken([FromBody] Client.Models.Users.UserRegistrationInfo userInfo, [FromServices] IJwtSigningEncodingKey signingEncodingKey, CancellationToken cancellationToken)
        {
            if (userInfo == null)
            {
                var error = ServiceErrorResponses.BodyIsMissing("UserInfo");
                return(BadRequest(error));
            }

            if (userInfo.Login == null || userInfo.Password == null)
            {
                var error = ServiceErrorResponses.NotEnoughUserData();
                return(BadRequest(error));
            }

            User user;

            try
            {
                user = await users.GetAsync(userInfo.Login, cancellationToken);
            }
            catch (UserNotFoundException)
            {
                var error = ServiceErrorResponses.UserNotFound();
                return(BadRequest(error));
            }

            var clientUser = UserConverter.Convert(user);

            var claims = new Claim[]
            {
                new Claim(ClaimTypes.Name, clientUser.Login),

                new Claim(ClaimTypes.NameIdentifier, clientUser.Id),
            };

            var encodedJwt = new JwtSecurityTokenHandler().WriteToken(JWT.GetJWT(claims, signingEncodingKey));

            return(Ok(new AuthTokenAnswer
            {
                AccessToken = encodedJwt
            }));
        }
예제 #5
0
        public ActionResult <string> Post([FromBody] UserRegistrationInfo authRequest,
                                          [FromServices] IJwtSigningEncodingKey signingEncodingKey, CancellationToken cancellationToken)
        {
            if (authRequest == null)
            {
                var error = ServiceErrorResponses.BodyIsMissing(nameof(authRequest));
                return(BadRequest(error));
            }

            var user = _userRepository.GetAsync(authRequest.Login, cancellationToken);

            if (user.Result == null)
            {
                var error = ServiceErrorResponses.UserNotFound(authRequest.Login);
                return(BadRequest(error));
            }

            if (user.Result.PasswordHash != Authenticator.HashPassword(authRequest.Password))
            {
                var error = ServiceErrorResponses.IncorrectPassword();
                return(BadRequest(error));
            }

            var claims = new Claim[]
            {
                new Claim(ClaimTypes.NameIdentifier, authRequest.Login),
            };

            var token = new JwtSecurityToken(
                issuer: "TodoListApp",
                audience: "Client",
                claims: claims,
                expires: DateTime.Now.AddMinutes(10),
                signingCredentials: new SigningCredentials(
                    signingEncodingKey.GetKey(),
                    signingEncodingKey.SigningAlgorithm)
                );

            string jwtToken = new JwtSecurityTokenHandler().WriteToken(token);

            return(jwtToken);
        }
예제 #6
0
        public async Task <IActionResult> CreateTaskAsync([FromBody] Client.Models.ToDoTasks.ToDoTaskBuildInfo buildInfo, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (buildInfo == null)
            {
                var error = ServiceErrorResponses.BodyIsMissing("ToDoTasksBuildInfo");
                return(this.BadRequest(error));
            }

            var userLoginRequest = this.HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Name);

            User user = null;

            try
            {
                user = await users.GetAsync(userLoginRequest.Value, cancellationToken);
            }
            catch
            {
                var error = ServiceErrorResponses.UserNotFound(userLoginRequest.Value);
                return(BadRequest(error));
            }

            //добавить try-catch в случае если аргументы null
            var modelCreationInfo = ToDoTaskBuildInfoConverter.Convert(user.Id.ToString(), buildInfo);

            var modelTaskInfo = await this.tasks.CreateAsync(modelCreationInfo, cancellationToken);

            var clientTaskInfo = ToDoTaskInfoConverter.Convert(modelTaskInfo);

            var routeParams = new Dictionary <string, object>
            {
                { "taskId", clientTaskInfo.Id }
            };

            return(this.CreatedAtRoute("GetTaskRoute", routeParams, clientTaskInfo));
        }
예제 #7
0
        public async Task <IActionResult> PatchTaskAsync([FromRoute] string taskId, [FromBody] Client.Models.ToDoTasks.ToDoTaskPatchInfo patchInfo, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (!Guid.TryParse(taskId, out var modelToDoTaskId))
            {
                var error = ServiceErrorResponses.ToDoTaskNotFound(taskId);
                return(this.NotFound(error));
            }

            var userLoginRequest = this.HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Name);

            User user = null;

            try
            {
                user = await users.GetAsync(userLoginRequest.Value, cancellationToken);
            }
            catch
            {
                var error = ServiceErrorResponses.UserNotFound(userLoginRequest.Value);
                return(BadRequest(error));
            }

            ToDoTask modelTask = null;

            try
            {
                modelTask = await this.tasks.GetAsync(modelToDoTaskId, cancellationToken);
            }
            catch (ToDoTaskNotFoundException)
            {
                var error = ServiceErrorResponses.ToDoTaskNotFound(taskId);
                return(NotFound(error));
            }


            if (user.Id != modelTask.UserId)
            {
                var error = ServiceErrorResponses.AccessDenied();
                return(StatusCode(StatusCodes.Status403Forbidden, error));
            }

            var modelPatchInfo = ToDoTaskPatchConverter.Convert(modelToDoTaskId, patchInfo);

            ToDoTask patchTask = null;

            try
            {
                patchTask = await tasks.PatchAsync(modelPatchInfo, cancellationToken);
            }
            catch (ToDoTaskNotFoundException)
            {
                var error = ServiceErrorResponses.ToDoTaskNotFound(taskId);
                return(NotFound(error));
            }

            var clientTask = ToDoTaskConverter.Convert(patchTask);

            return(Ok(clientTask));
        }