public async Task <IActionResult> PostAuthorizedUser([FromBody] AuthorizedUserRequest request) { _logger.LogInformation($"{nameof(UserController)} - {nameof(PostAuthorizedUser)} - Started"); var authorizedUser = await _userService.PostAuthorizedUser(request); _logger.LogInformation($"{nameof(UserController)} - {nameof(PostAuthorizedUser)} - Finished"); return(StatusCode(StatusCodes.Status200OK, authorizedUser)); }
/// <summary> /// Gets user's information from Microsoft /// </summary> /// <param name="request"></param> /// <returns></returns> private async Task <UserResponse> GetMicrosoftUser(AuthorizedUserRequest request) { _logger.LogInformation($"{nameof(UserService)} - {nameof(GetMicrosoftUser)} - Started, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); var microsoftConfig = _configuration.GetSection(ConfigurationConstants.MicrosoftGraph).Get <MicrosoftGraph>(); var url = $"{microsoftConfig.BaseUrl}/{microsoftConfig.Profile}"; var headers = _httpClientService.GetBearerJWTAuthorizationHeader(request.AccessToken); _logger.LogInformation($"{nameof(UserService)} - {nameof(GetMicrosoftUser)} - " + $"Calling {url}, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); var response = await _httpClientService.Json(url, HttpMethod.Get, headers); var responseContent = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) { _logger.LogError($"{nameof(UserService)} - {nameof(GetMicrosoftUser)} - " + $"Unsuccesfull call to {url}, " + $"{nameof(response.StatusCode)}: {response.StatusCode}, " + $"{nameof(responseContent)}: {responseContent}, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); throw new StatusCodeException(HttpStatusCode.BadRequest, $"Unable to obtain user's profile information"); } var microsoftProfileResponse = JsonConvert.DeserializeObject <MicrosoftProfileResponse>(responseContent); var userResponse = _mapper.Map <UserResponse>(microsoftProfileResponse); // url = $"{microsoftConfig.BaseUrl}/{microsoftConfig.Photo}"; // _logger.LogInformation($"{nameof(UserService)} - {nameof(GetMicrosoftUser)} - " + // $"Calling {url}, " + // $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); // response = await _httpClientService.Json(url, HttpMethod.Get, headers); // responseContent = await response.Content.ReadAsStringAsync(); // if (!response.IsSuccessStatusCode) // { // _logger.LogError($"{nameof(UserService)} - {nameof(GetMicrosoftUser)} - " + // $"Unsuccesfull call to {url}, " + // $"{nameof(response.StatusCode)}: {response.StatusCode}, " + // $"{nameof(responseContent)}: {responseContent}, " + // $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); // throw new StatusCodeException(HttpStatusCode.BadRequest, $"Unable to obtain user's profile picture"); // } //userResponse.Picture = new byte[] _logger.LogInformation($"{nameof(UserService)} - {nameof(GetMicrosoftUser)} - Finished, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); return(userResponse); }
/// <inheritdoc/> public async Task <AuthorizedUserResponse> PostAuthorizedUser(AuthorizedUserRequest request) { _logger.LogInformation($"{nameof(UserService)} - {nameof(PostAuthorizedUser)} -" + $"Started, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); UserResponse userResponse = null; switch (request.LogInTypeId) { case LogInTypeEnum.MICROSOFT: userResponse = await GetMicrosoftUser(request); break; case LogInTypeEnum.GOOGLE: userResponse = await GetGoogleUser(request); break; case LogInTypeEnum.FACEBOOK: userResponse = await GetFacebookUser(request); break; default: break; } userResponse.Picture = new byte[2]; var user = await _userRepository.GetWithExpression(x => x.Email.Equals(userResponse.Email)); if (user == null) { _logger.LogInformation($"{nameof(UserService)} - {nameof(PostAuthorizedUser)} -" + $"{nameof(user)} not found, creating user, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); var newUser = _mapper.Map <User>(userResponse); await _userRepository.Add(newUser); user = newUser; } var authorizedUserResponse = _mapper.Map <AuthorizedUserResponse>(user); authorizedUserResponse.JWTToken = _tokenService.CreateJWTToken(user); _logger.LogInformation($"{nameof(UserService)} - {nameof(PostAuthorizedUser)} -" + $"Finished, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); return(authorizedUserResponse); }
/// <summary> /// Gets the user's information from Google Sign in /// </summary> /// <param name="request"></param> /// <returns></returns> private async Task <UserResponse> GetGoogleUser(AuthorizedUserRequest request) { GoogleJsonWebSignature.Payload payload = await GoogleJsonWebSignature.ValidateAsync(request.AccessToken); if (!payload.Audience.Equals(Environment.GetEnvironmentVariable(EnvironmentConstants.GOOGLE_CLIENTID))) { throw new StatusCodeException(HttpStatusCode.Forbidden, $"{nameof(EnvironmentConstants.GOOGLE_CLIENTID)} not valid"); } if (!payload.EmailVerified) { throw new StatusCodeException(HttpStatusCode.Forbidden, $"{nameof(payload.EmailVerified)} is false"); } return(_mapper.Map <UserResponse>(payload)); }
/// <summary> /// Validates access token and obtains user information /// </summary> /// <param name="request"></param> /// <returns></returns> private async Task <UserResponse> GetFacebookUser(AuthorizedUserRequest request) { _logger.LogInformation($"{nameof(UserService)} - {nameof(GetFacebookUser)} - Started, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); var facebookConfig = _configuration.GetSection(ConfigurationConstants.Facebook).Get <Facebook>(); var url = $"{facebookConfig.BaseUrl}/{facebookConfig.ValidateToken}"; url = string.Format(url, request.AccessToken, request.AccessToken); _logger.LogInformation($"{nameof(UserService)} - {nameof(GetFacebookUser)} - " + $"Calling {url}, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); var response = await _httpClientService.Json(url, HttpMethod.Get); var responseContent = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) { _logger.LogError($"{nameof(UserService)} - {nameof(GetFacebookUser)} - " + $"Unsuccesfull call to {url}, " + $"{nameof(response.StatusCode)}: {response.StatusCode}, " + $"{nameof(responseContent)}: {responseContent}, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); throw new StatusCodeException(HttpStatusCode.Forbidden, $"Invalid {nameof(request.AccessToken)}"); } var fbValidTokenResponse = JsonConvert.DeserializeObject <FacebookValidateTokenResponse>(responseContent); if (!fbValidTokenResponse.Data.IsValid) { _logger.LogError($"{nameof(UserService)} - {nameof(GetFacebookUser)} - " + $"Facebook {nameof(request.AccessToken)} not valid, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); throw new StatusCodeException(HttpStatusCode.Forbidden, $"{nameof(request.AccessToken)} not valid"); } if (!fbValidTokenResponse.Data.AppId.Equals(Environment.GetEnvironmentVariable(EnvironmentConstants.FACEBOOK_CLIENTID))) { _logger.LogError($"{nameof(UserService)} - {nameof(GetFacebookUser)} - " + $"Facebook {nameof(fbValidTokenResponse.Data.AppId)} not valid, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); throw new StatusCodeException(HttpStatusCode.Forbidden, $"{nameof(fbValidTokenResponse.Data.AppId)} not valid"); } url = $"{facebookConfig.BaseUrl}/{facebookConfig.UserInformation}"; url = string.Format(url, fbValidTokenResponse.Data.UserId, request.AccessToken); _logger.LogInformation($"{nameof(UserService)} - {nameof(GetFacebookUser)} - " + $"Calling {url}, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); response = await _httpClientService.Json(url, HttpMethod.Get); responseContent = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) { _logger.LogError($"{nameof(UserService)} - {nameof(GetFacebookUser)} - " + $"Unsuccesfull call to {url}, " + $"{nameof(response.StatusCode)}: {response.StatusCode}, " + $"{nameof(responseContent)}: {responseContent}, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); throw new StatusCodeException(HttpStatusCode.BadRequest, $"Could not obtain user's infomation from Facebook"); } var fbUserInfo = JsonConvert.DeserializeObject <FacebookUserInformationResponse>(responseContent); _logger.LogInformation($"{nameof(UserService)} - {nameof(GetFacebookUser)} - Finished, " + $"{nameof(request)}: {JsonConvert.SerializeObject(request)}"); return(_mapper.Map <UserResponse>(fbUserInfo)); }