using Complex.Application.PersonService; using Complex.Application.Services.Utility; using Complex.Application.Utility; using Complex.Common.Dto; using Complex.Domain.Entities; using Complex.EndPoint.Utility; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; namespace Complex.EndPoint.Controllers { [ApiVersion("1")] [Route("api/v{version:apiVersion}/[controller]")] //[Route("[controller]")] [ApiController] public class AccountController : Controller { private readonly IConfiguration _configuration; private readonly ISiteAccountlService _SiteAccountlService; private readonly IUserTokenService _userTokenService; private readonly ISendUserMessage _sendUserMessage; public AccountController(IConfiguration configuration , ISiteAccountlService siteAccountlService, IUserTokenService userTokenRepository, ISendUserMessage sendUserMessage) { this._configuration = configuration; this._SiteAccountlService = siteAccountlService; this._userTokenService = userTokenRepository; this._sendUserMessage = sendUserMessage; } [HttpPost] public IActionResult Post(string PhoneNumber, string SmsCode) { try { var loginResult = _SiteAccountlService.Login(PhoneNumber, SmsCode); if (loginResult.IsSuccess == false) { return Ok(new LoginResultDto() { IsSuccess = false, Message = loginResult.Message }); } var token = CreateToken(loginResult.Person); return Ok(new LoginResultDto() { IsSuccess = true, Data = token, }); } catch (Exception ex) { if (ex.InnerException != null) ex = ex.InnerException; return Ok(new LoginResultDto { IsSuccess = false, Message = ex.Message + "----" + ex.StackTrace }); } } [HttpPost] [Route("RefreshToken")] public IActionResult RefreshToken(string Refreshtoken) { var usertoken = _userTokenService.FindRefreshToken(Refreshtoken); if (usertoken == null) { return Unauthorized(); } if (usertoken.RefreshTokenExp < DateTime.Now) { return Unauthorized("Token Expire"); } var token = CreateToken(usertoken.Person); _userTokenService.DeleteToken(Refreshtoken); return Ok(token); } [Route("GetSmsCode")] [HttpGet] public ResultDto GetSmsCode(string PhoneNumber) { var smsCode = _SiteAccountlService.GetCode(PhoneNumber); //_sendUserMessage.SendPattern("z3rx7fywigv5tdb", PhoneNumber, new { code = smsCode }); //return new ResultDto { IsSuccess = true, Message = "پیامک ارسال شد" }; return new ResultDto { IsSuccess = true, Message = smsCode }; } [Authorize] [HttpGet] [Route("Logout")] public IActionResult Logout() { var user = User.Claims.First(p => p.Type == "UserId").Value; _SiteAccountlService.Logout(user); return Ok(); } private LoginDataDto CreateToken(Person user) { //SecurityHelper securityHelper = new SecurityHelper(); var claims = new List { new Claim ("UserId", user.Id.SimpleCodeString()), new Claim ("Name", user.FirstName.SimpleCodeString()), new Claim ("Family", user.LastName.SimpleCodeString()), }; string key = _configuration["JWtConfig:Key"]; var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)); var credentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256); var tokenexp = DateTime.Now.AddDays(30);//.AddMinutes(int.Parse(_configuration["JWtConfig:expires"])); var token = new JwtSecurityToken( issuer: _configuration["JWtConfig:issuer"], audience: _configuration["JWtConfig:audience"], expires: tokenexp, notBefore: DateTime.Now, claims: claims, signingCredentials: credentials ); var jwtToken = new JwtSecurityTokenHandler().WriteToken(token); var refreshToken = Guid.NewGuid(); _userTokenService.SaveToken(new UserToken() { MobileModel = "", TokenExp = tokenexp, TokenHash = jwtToken, //securityHelper.Getsha256Hash(jwtToken), Person = user, RefreshToken = refreshToken.ToString(),//securityHelper.Getsha256Hash(refreshToken.ToString()), RefreshTokenExp = DateTime.Now.AddDays(60) }); return new LoginDataDto() { Token = jwtToken, RefreshToken = refreshToken.ToString() }; } } }