Compare commits
No commits in common. "3239f437615d1dbf77cad65ea8bb30e64aa5fafc" and "200399575f7a8289290ed7fa7da7659ec9d0fa24" have entirely different histories.
3239f43761
...
200399575f
34
Program.cs
34
Program.cs
|
@ -38,15 +38,7 @@ var dbString = builder.Configuration.GetConnectionString("MariaDbConnection");
|
||||||
var userString = builder.Configuration.GetConnectionString("DBAccount");
|
var userString = builder.Configuration.GetConnectionString("DBAccount");
|
||||||
|
|
||||||
// JWT 설정부 시작
|
// JWT 설정부 시작
|
||||||
if (builder.Environment.IsDevelopment())
|
builder.Configuration.AddJsonFile("private/jwtSetting.json", optional: true, reloadOnChange: true);
|
||||||
{
|
|
||||||
builder.Configuration.AddJsonFile("private/jwtSetting.Development.json", optional: true, reloadOnChange: true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
builder.Configuration.AddJsonFile("private/jwtSetting.json", optional: true, reloadOnChange: true);
|
|
||||||
}
|
|
||||||
|
|
||||||
builder.Services.Configure<JwtSettings>(builder.Configuration.GetSection("JwtSettings"));
|
builder.Services.Configure<JwtSettings>(builder.Configuration.GetSection("JwtSettings"));
|
||||||
|
|
||||||
builder.Services.AddAuthentication(options =>
|
builder.Services.AddAuthentication(options =>
|
||||||
|
@ -65,17 +57,13 @@ builder.Services.AddAuthentication(options =>
|
||||||
ValidateIssuerSigningKey = true,
|
ValidateIssuerSigningKey = true,
|
||||||
ValidIssuer = jwtSettings.Issuer,
|
ValidIssuer = jwtSettings.Issuer,
|
||||||
ValidAudience = jwtSettings.Audience,
|
ValidAudience = jwtSettings.Audience,
|
||||||
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey)),
|
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey))
|
||||||
ClockSkew = TimeSpan.FromMinutes(jwtSettings.ClockSkewMinutes)
|
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
// JWT 설정부 끝
|
// JWT 설정부 끝
|
||||||
|
|
||||||
builder.Services.AddControllers();
|
builder.Services.AddControllers();
|
||||||
|
|
||||||
// 여기다가 API 있는 컨트롤러들 AddScoped 하면 되는건가?
|
// 여기다가 API 있는 컨트롤러들 AddScoped 하면 되는건가?
|
||||||
builder.Services.AddScoped<AcaMate.Common.Token.JwtTokenService>();
|
|
||||||
builder.Services.AddScoped<IRepositoryService, AcaMate.V1.Services.RepositoryService>();
|
|
||||||
// builder.Services.AddScoped<UserService>(); //
|
// builder.Services.AddScoped<UserService>(); //
|
||||||
// builder.Services.AddScoped<UserController>();
|
// builder.Services.AddScoped<UserController>();
|
||||||
|
|
||||||
|
@ -100,21 +88,6 @@ builder.Services.AddCors(option =>
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 로그 설정 부분
|
|
||||||
builder.Logging.ClearProviders();
|
|
||||||
builder.Logging.AddConsole();
|
|
||||||
if (builder.Environment.IsDevelopment()) {
|
|
||||||
builder.Logging.SetMinimumLevel(LogLevel.Trace);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
builder.Logging.SetMinimumLevel(LogLevel.Warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 로컬 테스트 위한 부분 (올릴때는 꺼두기)
|
|
||||||
// builder.WebHost.UseUrls("http://0.0.0.0:5144");
|
|
||||||
|
|
||||||
///// ===== builder 설정 부 ===== /////
|
///// ===== builder 설정 부 ===== /////
|
||||||
|
|
||||||
|
@ -133,9 +106,8 @@ else
|
||||||
app.UseHsts();
|
app.UseHsts();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 로컬 테스트 위한 부분 (올릴떄는 켜두기)
|
|
||||||
app.UseHttpsRedirection();
|
|
||||||
|
|
||||||
|
app.UseHttpsRedirection();
|
||||||
app.UseRouting();
|
app.UseRouting();
|
||||||
// app.MapControllers();
|
// app.MapControllers();
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
using AcaMate.Common.Models;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using AcaMate.V1.Models;
|
using AcaMate.V1.Models;
|
||||||
using Version = AcaMate.V1.Models.Version;
|
using Version = AcaMate.V1.Models.Version;
|
||||||
|
@ -14,18 +13,10 @@ public class AppDbContext: DbContext
|
||||||
//MARK: Program
|
//MARK: Program
|
||||||
public DbSet<Version> Version { get; set; }
|
public DbSet<Version> Version { get; set; }
|
||||||
public DbSet<Academy> Academy { get; set; }
|
public DbSet<Academy> Academy { get; set; }
|
||||||
public DbSet<RefreshToken> RefreshTokens { get; set; }
|
|
||||||
|
|
||||||
//MARK: USER
|
//MARK: USER
|
||||||
public DbSet<Login> Login { get; set; }
|
public DbSet<Login> Login { get; set; }
|
||||||
public DbSet<User_Academy> UserAcademy { get; set; }
|
public DbSet<User_Academy> UserAcademy { get; set; }
|
||||||
public DbSet<User> User { get; set; }
|
|
||||||
public DbSet<Permission> Permission { get; set; }
|
|
||||||
// public DbSet<Token> Token { get; set; }
|
|
||||||
public DbSet<Location> Location { get; set; }
|
|
||||||
public DbSet<Contact> Contact { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,116 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.IdentityModel.Tokens.Jwt;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Text;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using AcaMate.Common.Models;
|
|
||||||
using Microsoft.IdentityModel.Tokens;
|
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
using Microsoft.AspNetCore.Authentication;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
|
|
||||||
using System.Security.Cryptography;
|
|
||||||
|
|
||||||
namespace AcaMate.Common.Token;
|
|
||||||
|
|
||||||
public class JwtTokenService
|
|
||||||
{
|
|
||||||
private readonly JwtSettings _jwtSettings;
|
|
||||||
|
|
||||||
private readonly ILogger<JwtTokenService> _logger;
|
|
||||||
|
|
||||||
public JwtTokenService(IOptions<JwtSettings> jwtSettings, ILogger<JwtTokenService> logger)
|
|
||||||
{
|
|
||||||
_jwtSettings = jwtSettings.Value;
|
|
||||||
_logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string GenerateJwtToken(string uid)//, string role)
|
|
||||||
{
|
|
||||||
// 1. 클레임(Claim) 설정 - 필요에 따라 추가 정보도 포함
|
|
||||||
var claims = new List<Claim>
|
|
||||||
{
|
|
||||||
// 토큰 주체(sub) 생성을 위해 값으로 uid를 사용함 : 토큰이 대표하는 고유 식별자
|
|
||||||
new Claim(JwtRegisteredClaimNames.Sub, uid),
|
|
||||||
// Jti 는 토큰 식별자로 토큰의 고유 ID 이다.
|
|
||||||
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
|
|
||||||
// jwt 토큰이 가지는 권한
|
|
||||||
// new Claim(ClaimTypes.Role, role),
|
|
||||||
// 추가 클레임 예: new Claim(ClaimTypes.Role, "Admin")
|
|
||||||
};
|
|
||||||
|
|
||||||
// 2. 비밀 키와 SigningCredentials 생성
|
|
||||||
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecretKey));
|
|
||||||
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
|
|
||||||
|
|
||||||
// 3. 토큰 생성 (Issuer, Audience, 만료 시간, 클레임, 서명 정보 포함)
|
|
||||||
var token = new JwtSecurityToken(
|
|
||||||
issuer: _jwtSettings.Issuer,
|
|
||||||
audience: _jwtSettings.Audience,
|
|
||||||
claims: claims,
|
|
||||||
expires: DateTime.Now.AddMinutes(_jwtSettings.ExpiryMinutes),
|
|
||||||
signingCredentials: credentials
|
|
||||||
);
|
|
||||||
|
|
||||||
// 4. 토큰 객체를 문자열로 변환하여 반환
|
|
||||||
return new JwtSecurityTokenHandler().WriteToken(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RefreshToken GenerateRefreshToken(string uid)
|
|
||||||
{
|
|
||||||
var randomNumber = new byte[32]; // 256비트
|
|
||||||
using (var rng = RandomNumberGenerator.Create())
|
|
||||||
{
|
|
||||||
rng.GetBytes(randomNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
// return Convert.ToBase64String(randomNumber);
|
|
||||||
return new RefreshToken()
|
|
||||||
{
|
|
||||||
uid = uid,
|
|
||||||
refresh_token = Convert.ToBase64String(randomNumber),
|
|
||||||
create_Date = DateTime.UtcNow,
|
|
||||||
expire_date = DateTime.UtcNow.AddDays(_jwtSettings.RefreshTokenExpiryDays)
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public ClaimsPrincipal ValidateToken(string token)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrWhiteSpace(token)) return null;
|
|
||||||
var tokenHandler = new JwtSecurityTokenHandler();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var key = Encoding.UTF8.GetBytes(_jwtSettings.SecretKey);
|
|
||||||
var validationParameters = new TokenValidationParameters
|
|
||||||
{
|
|
||||||
ValidateIssuerSigningKey = true,
|
|
||||||
IssuerSigningKey = new SymmetricSecurityKey(key),
|
|
||||||
ValidateIssuer = true,
|
|
||||||
ValidIssuer = _jwtSettings.Issuer,
|
|
||||||
ValidateAudience = true,
|
|
||||||
ValidAudience = _jwtSettings.Audience,
|
|
||||||
ValidateLifetime = true,
|
|
||||||
ClockSkew = TimeSpan.FromMinutes(_jwtSettings.ClockSkewMinutes)
|
|
||||||
};
|
|
||||||
var principal = tokenHandler.ValidateToken(token, validationParameters, out var securityToken);
|
|
||||||
return principal;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"검증 실패 {e}");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,6 +1,3 @@
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
|
|
||||||
namespace AcaMate.Common.Models;
|
namespace AcaMate.Common.Models;
|
||||||
|
|
||||||
public class JwtSettings
|
public class JwtSettings
|
||||||
|
@ -9,44 +6,4 @@ public class JwtSettings
|
||||||
public string Issuer { get; set; }
|
public string Issuer { get; set; }
|
||||||
public string Audience { get; set; }
|
public string Audience { get; set; }
|
||||||
public int ExpiryMinutes { get; set; }
|
public int ExpiryMinutes { get; set; }
|
||||||
public int ClockSkewMinutes { get; set; }
|
}
|
||||||
public int RefreshTokenExpiryDays { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[Table("refresh_token")]
|
|
||||||
public class RefreshToken
|
|
||||||
{
|
|
||||||
[Key]
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string uid { get; set; }
|
|
||||||
public string refresh_token { get; set; }
|
|
||||||
public DateTime create_Date { get; set; }
|
|
||||||
public DateTime expire_date { get; set; }
|
|
||||||
|
|
||||||
// 이건 로그아웃시에 폐기 시킬예정이니 그떄 변경하는걸로 합시다.
|
|
||||||
public DateTime? revoke_Date { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ValidateToken
|
|
||||||
{
|
|
||||||
public string token { get; set; }
|
|
||||||
public string refresh { get; set; }
|
|
||||||
public string uid { get; set; }
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
"""
|
|
||||||
토큰 동작 관련
|
|
||||||
다시 물어보자 토큰 로직 관련해서 일단은 로그인을 예로 들면
|
|
||||||
1. 로그인을 진행한다.
|
|
||||||
2. 회원이 DB에 정상적으로 존재한다.
|
|
||||||
3. 엑세스 토큰과 리프레시 토큰을 생성한다.
|
|
||||||
4. 엑세스 토큰은 클라이언트로 리프래시 토큰은 서버에 저장하고 클라이언트로도 보낸다.
|
|
||||||
5. (상황1) 시간이 경과해 엑세스 토큰의 시간이 경과했다.
|
|
||||||
6. (상황2) 회원 정보에 대한 접근이 필요한 동작을 수행한다.
|
|
||||||
7. 엑세스 토큰과 리프레시 토큰을 서버로 전송한다.
|
|
||||||
8. 엑세스 토큰이 만료가 되었음이 확인이 되면 리프레시 토큰으로 새 엑세스를 만들기 위해 리프레시 토큰을 확인한다.
|
|
||||||
9. 리프레시 토큰이 만료가 되지 않았다면 리프레시 토큰을 토대로 엑세스 토큰을 생성한다.
|
|
||||||
10. 생성된 엑세스 토큰을 가지고 상황2의 동작을 수행하고 엑세스 토큰을 반환한다.
|
|
||||||
"""
|
|
||||||
*/
|
|
|
@ -2,7 +2,7 @@ using System.Text.Json;
|
||||||
|
|
||||||
namespace AcaMate.Common.Models;
|
namespace AcaMate.Common.Models;
|
||||||
|
|
||||||
public class APIResponseStatus<T>
|
public class APIResponseStatus<T>
|
||||||
{
|
{
|
||||||
public Status status { get; set; }
|
public Status status { get; set; }
|
||||||
public T? data { get; set; }
|
public T? data { get; set; }
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using AcaMate.Common.Data;
|
using AcaMate.Common.Data;
|
||||||
using AcaMate.Common.Models;
|
using AcaMate.Common.Models;
|
||||||
using AcaMate.V1.Models;
|
|
||||||
using Microsoft.AspNetCore.Http.HttpResults;
|
using Microsoft.AspNetCore.Http.HttpResults;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
@ -13,13 +13,6 @@ namespace AcaMate.V1.Controllers;
|
||||||
[ApiExplorerSettings(GroupName = "사업자 정보")]
|
[ApiExplorerSettings(GroupName = "사업자 정보")]
|
||||||
public class MemberController: ControllerBase
|
public class MemberController: ControllerBase
|
||||||
{
|
{
|
||||||
private readonly AppDbContext _dbContext;
|
|
||||||
|
|
||||||
public MemberController(AppDbContext dbContext)
|
|
||||||
{
|
|
||||||
_dbContext = dbContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("business")]
|
[HttpGet("business")]
|
||||||
public IActionResult GetBusinessData()
|
public IActionResult GetBusinessData()
|
||||||
{
|
{
|
||||||
|
@ -27,17 +20,10 @@ public class MemberController: ControllerBase
|
||||||
return Ok("DB 참조");
|
return Ok("DB 참조");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// -- -- -- -- -- -- -- -- -- -- -- -- //
|
|
||||||
|
|
||||||
[HttpGet("/api/v1/out/member/business")]
|
[HttpGet("/v1/out/member/business")]
|
||||||
public IActionResult SearchBusinessNo()
|
public IActionResult SearchBusinessNo()
|
||||||
{
|
{
|
||||||
return Ok("외부 참조");
|
return Ok("외부 참조");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,72 +1,71 @@
|
||||||
using System.IdentityModel.Tokens.Jwt;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using Microsoft.IdentityModel.Tokens;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using System.Text.Json;
|
||||||
using System.Linq.Expressions;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Microsoft.EntityFrameworkCore.Query;
|
|
||||||
using MySqlConnector;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
using AcaMate.Common.Data;
|
using AcaMate.Common.Data;
|
||||||
using AcaMate.Common.Token;
|
|
||||||
using AcaMate.Common.Models;
|
using AcaMate.Common.Models;
|
||||||
|
|
||||||
using AcaMate.V1.Models;
|
using AcaMate.V1.Models;
|
||||||
using AcaMate.V1.Services;
|
|
||||||
|
|
||||||
namespace AcaMate.V1.Controllers;
|
namespace AcaMate.V1.Controllers;
|
||||||
|
|
||||||
|
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("/api/v1/in/user")]
|
[Route("/api/v1/in/user")]
|
||||||
[ApiExplorerSettings(GroupName = "사용자")]
|
[ApiExplorerSettings(GroupName = "사용자")]
|
||||||
public class UserController : ControllerBase
|
public class UserController: ControllerBase
|
||||||
{
|
{
|
||||||
private readonly AppDbContext _dbContext;
|
private readonly AppDbContext _dbContext;
|
||||||
private readonly ILogger<UserController> _logger;
|
public UserController(AppDbContext dbContext)
|
||||||
private readonly JwtTokenService _jwtTokenService;
|
|
||||||
private readonly IRepositoryService _repositoryService;
|
|
||||||
|
|
||||||
public UserController(AppDbContext dbContext, ILogger<UserController> logger, JwtTokenService jwtTokenService, IRepositoryService repositoryService)
|
|
||||||
{
|
{
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_logger = logger;
|
|
||||||
_jwtTokenService = jwtTokenService;
|
|
||||||
_repositoryService = repositoryService;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet("login")]
|
||||||
[CustomOperation("회원 정보 조회", "회원 정보 조회", "사용자")]
|
[CustomOperation("SNS 로그인", "로그인 후 회원이 있는지 확인", "사용자")]
|
||||||
public IActionResult GetUserData(string uid)
|
public IActionResult SNSLogin(string acctype,string sns_id)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(uid)) return BadRequest(DefaultResponse.InvalidInputError);
|
|
||||||
|
if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(sns_id))
|
||||||
|
{
|
||||||
|
return BadRequest(DefaultResponse.InvalidInputError);
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var user = _dbContext.User
|
var login = _dbContext.Login.FirstOrDefault(l => l.sns_type == acctype && l.sns_id == sns_id);
|
||||||
.Where(u => u.uid == uid)
|
|
||||||
.Select(u => new User
|
string uid = "";
|
||||||
{
|
List<string> bids = new List<string>();
|
||||||
uid = u.uid,
|
|
||||||
name = u.name,
|
if (login != null)
|
||||||
auto_login_yn = u.auto_login_yn,
|
|
||||||
birth = u.birth,
|
|
||||||
device_id = u.device_id,
|
|
||||||
login_date = u.login_date,
|
|
||||||
type = u.type
|
|
||||||
})
|
|
||||||
.FirstOrDefault();
|
|
||||||
|
|
||||||
var response = new APIResponseStatus<User>
|
|
||||||
{
|
{
|
||||||
status = new Status
|
uid = login.uid;
|
||||||
|
var userAcademy = _dbContext.UserAcademy.Where(u => u.uid == uid).ToList();
|
||||||
|
|
||||||
|
foreach(User_Academy userData in userAcademy)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"uid: {userData.uid} || bid: {userData.bid}");
|
||||||
|
bids.Add(userData.bid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return StatusCode(002, DefaultResponse.NotFoundError);
|
||||||
|
}
|
||||||
|
|
||||||
|
var response = new APIResponseStatus<dynamic>
|
||||||
|
{
|
||||||
|
status = new Status()
|
||||||
{
|
{
|
||||||
code = "000",
|
code = "000",
|
||||||
message = "정상"
|
message = "정상"
|
||||||
},
|
},
|
||||||
data = user
|
data = new
|
||||||
|
{
|
||||||
|
uid = $"{uid}",
|
||||||
|
bid = bids
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return Ok(response.JsonToString());
|
return Ok(response.JsonToString());
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -74,238 +73,5 @@ public class UserController : ControllerBase
|
||||||
return StatusCode(500, DefaultResponse.UnknownError);
|
return StatusCode(500, DefaultResponse.UnknownError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("login")]
|
|
||||||
[CustomOperation("SNS 로그인", "로그인 후 회원이 있는지 확인", "사용자")]
|
|
||||||
public async Task<IActionResult> Login(string acctype, string sns_id)
|
|
||||||
{
|
|
||||||
// API 동작 파라미터 입력 값 확인
|
|
||||||
if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(sns_id))
|
|
||||||
return BadRequest(DefaultResponse.InvalidInputError);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var login = await _dbContext.Login
|
|
||||||
.FirstOrDefaultAsync(l => l.sns_type == acctype && l.sns_id == sns_id);
|
|
||||||
|
|
||||||
if (login != null)
|
|
||||||
{
|
|
||||||
// 로그인 정보가 존재 하는 상황
|
|
||||||
var uid = login.uid;
|
|
||||||
|
|
||||||
var user = await _dbContext.User
|
|
||||||
.FirstOrDefaultAsync(u => u.uid == uid);
|
|
||||||
|
|
||||||
if (user != null)
|
|
||||||
{
|
|
||||||
// 정상적으로 User 테이블에도 있는것이 확인 됨
|
|
||||||
user.login_date = DateTime.Now;
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
|
|
||||||
// 토큰 생성은 로그인이 이제 되고 나서 한다.
|
|
||||||
var accessToken = _jwtTokenService.GenerateJwtToken(uid);//, "Normal");
|
|
||||||
var refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
|
|
||||||
_logger.LogInformation($"{uid}: {accessToken}, {refreshToken}");
|
|
||||||
|
|
||||||
await _repositoryService.SaveData<RefreshToken, string>(refreshToken, rt => rt.uid);
|
|
||||||
|
|
||||||
|
|
||||||
var response = new APIResponseStatus<dynamic>
|
|
||||||
{
|
|
||||||
status = new Status
|
|
||||||
{
|
|
||||||
code = "000",
|
|
||||||
message = "정상"
|
|
||||||
},
|
|
||||||
data = new
|
|
||||||
{
|
|
||||||
token = accessToken,
|
|
||||||
refresh = refreshToken.refresh_token
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return Ok(response.JsonToString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// case 1: Login 테이블에 값이 없다 == 로그인이 처음
|
|
||||||
// case 2: User 테이블에 값이 없다 == 이건 문제가 있는 상황 -> 해결은 회원가입 재 진행 시도
|
|
||||||
// Login에는 있는데 User 테이블에 없다? 말이 안되긴 하는데...
|
|
||||||
return Ok(new APIResponseStatus<dynamic>
|
|
||||||
{
|
|
||||||
status = new Status
|
|
||||||
{
|
|
||||||
code = "010",
|
|
||||||
message = "로그인 정보 없음 > 회원 가입 진행"
|
|
||||||
},
|
|
||||||
data = new
|
|
||||||
{
|
|
||||||
token = "",
|
|
||||||
refresh = ""
|
|
||||||
// bidList = new string[] { }
|
|
||||||
}
|
|
||||||
}.JsonToString());
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"[로그인] 에러 발생 : {ex}");
|
|
||||||
return StatusCode(500, DefaultResponse.UnknownError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("academy")]
|
|
||||||
[CustomOperation("학원 리스트 확인", "사용자가 등록된 학원 리스트 확인", "사용자")]
|
|
||||||
public async Task<IActionResult> ReadAcademyInfo(string token, string refresh)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"토큰 : {token}, {refresh}");
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh))
|
|
||||||
{
|
|
||||||
var error = DefaultResponse.InvalidInputError;
|
|
||||||
return Ok(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var validateToken = await _repositoryService.ValidateToken(token, refresh);
|
|
||||||
var uid = validateToken.uid;
|
|
||||||
|
|
||||||
var userAcademy = await _dbContext.UserAcademy
|
|
||||||
.Where(ua => ua.uid == uid)
|
|
||||||
.Select(ua => ua.bid)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
|
|
||||||
var academies = await _dbContext.Academy
|
|
||||||
.Where(a => userAcademy.Contains(a.bid))
|
|
||||||
.Select(a => new AcademyName
|
|
||||||
{
|
|
||||||
bid = a.bid,
|
|
||||||
name = a.business_name
|
|
||||||
})
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
var response = new APIResponseStatus<List<AcademyName>>
|
|
||||||
{
|
|
||||||
status = new Status
|
|
||||||
{
|
|
||||||
code = "000",
|
|
||||||
message = "정상"
|
|
||||||
},
|
|
||||||
data = academies
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
return Ok(response);
|
|
||||||
}
|
|
||||||
catch (SecurityTokenException tokenEx)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"[로그인][오류] 토큰 검증 : {tokenEx}");
|
|
||||||
return StatusCode(500, DefaultResponse.InvalidInputError);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"[로그인][오류] 에러 발생 : {ex}");
|
|
||||||
return StatusCode(500, DefaultResponse.UnknownError);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost("register")]
|
|
||||||
[CustomOperation("회원 가입", "사용자 회원 가입", "사용자")]
|
|
||||||
public async Task<IActionResult> UserRegister([FromBody] UserAll request)
|
|
||||||
{
|
|
||||||
if (!ModelState.IsValid) return BadRequest(DefaultResponse.InvalidInputError);
|
|
||||||
|
|
||||||
var atIndext = request.email.IndexOf('@');
|
|
||||||
var localPart_email = request.email.Substring(0, atIndext);
|
|
||||||
var uid = $"AM{localPart_email}{DateTime.Now:yyyyMMdd}";
|
|
||||||
|
|
||||||
var user = new User
|
|
||||||
{
|
|
||||||
uid = uid,
|
|
||||||
name = request.name,
|
|
||||||
birth = request.birth,
|
|
||||||
type = request.type,
|
|
||||||
device_id = request.device_id,
|
|
||||||
auto_login_yn = request.auto_login_yn,
|
|
||||||
login_date = request.login_date
|
|
||||||
};
|
|
||||||
var login = new Login
|
|
||||||
{
|
|
||||||
uid = uid,
|
|
||||||
sns_id = request.sns_id,
|
|
||||||
sns_type = request.sns_type
|
|
||||||
};
|
|
||||||
|
|
||||||
var permission = new Permission
|
|
||||||
{
|
|
||||||
uid = uid,
|
|
||||||
location_yn = request.location_yn,
|
|
||||||
camera_yn = request.camera_yn,
|
|
||||||
photo_yn = request.photo_yn,
|
|
||||||
push_yn = request.push_yn,
|
|
||||||
market_app_yn = request.market_app_yn,
|
|
||||||
market_sms_yn = request.market_sms_yn,
|
|
||||||
market_email_yn = request.market_email_yn
|
|
||||||
};
|
|
||||||
|
|
||||||
var contact = new Contact
|
|
||||||
{
|
|
||||||
uid = uid,
|
|
||||||
email = request.email,
|
|
||||||
phone = request.phone,
|
|
||||||
address = request.address
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
if (await _repositoryService.SaveData<User, string>(user, u => u.uid))
|
|
||||||
{
|
|
||||||
await _repositoryService.SaveData<Login, string>(login, l => l.sns_id);
|
|
||||||
await _repositoryService.SaveData<Permission, string>(permission, p => p.uid);
|
|
||||||
await _repositoryService.SaveData<Contact, string>(contact, c => c.uid);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TO-DO: jwt 토큰 만들어서 여기서 보내는 작업을 해야 함
|
|
||||||
var token = _jwtTokenService.GenerateJwtToken(uid);//, "admin");
|
|
||||||
var refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
|
|
||||||
await _repositoryService.SaveData<RefreshToken, string>(refreshToken, rt => rt.uid);
|
|
||||||
|
|
||||||
var result = new APIResponseStatus<dynamic>()
|
|
||||||
{
|
|
||||||
status = new Status()
|
|
||||||
{
|
|
||||||
code = "000",
|
|
||||||
message = "정상"
|
|
||||||
},
|
|
||||||
data = new
|
|
||||||
{
|
|
||||||
accessToken = token,
|
|
||||||
refreshToken = refreshToken.refresh_token
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return Ok(result.JsonToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("logout")]
|
|
||||||
[CustomOperation("로그아웃", "사용자 로그아웃", "사용자")]
|
|
||||||
public async Task<IActionResult> LogOut(string token, string refresh) //([FromBody] UserAll request)
|
|
||||||
{
|
|
||||||
/* */
|
|
||||||
// var value = await ValidateToken(token, refresh);
|
|
||||||
// _logger.LogInformation(value.uid);
|
|
||||||
// _logger.LogInformation(value.refresh);
|
|
||||||
// _logger.LogInformation(value.token);
|
|
||||||
/* */
|
|
||||||
|
|
||||||
|
|
||||||
return Ok("로그아웃");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -9,23 +9,10 @@ public class Academy
|
||||||
[Key]
|
[Key]
|
||||||
public string bid { get; set; }
|
public string bid { get; set; }
|
||||||
public string business_name { get; set; }
|
public string business_name { get; set; }
|
||||||
public string business_owner { get; set; }
|
public string business_ownder { get; set; }
|
||||||
public string business_number { get; set; }
|
public string business_number { get; set; }
|
||||||
public DateTime business_date { get; set; }
|
public DateTime business_date { get; set; }
|
||||||
public string business_address { get; set; }
|
public string business_address { get; set; }
|
||||||
public string business_contact { get; set; }
|
public string business_contact { get; set; }
|
||||||
public string uid { get; set; }
|
public string uid { get; set; }
|
||||||
}
|
|
||||||
|
|
||||||
// -- -- -- -- -- DB 테이블 -- -- -- -- -- //
|
|
||||||
|
|
||||||
public class AcademyName
|
|
||||||
{
|
|
||||||
public string bid { get; set; }
|
|
||||||
public string name { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RequestAcademy
|
|
||||||
{
|
|
||||||
public List<string> bids { get; set; }
|
|
||||||
}
|
}
|
30
Program/V1/Models/Login.cs
Normal file
30
Program/V1/Models/Login.cs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
|
namespace AcaMate.V1.Models;
|
||||||
|
|
||||||
|
[Table("login")]
|
||||||
|
public class Login
|
||||||
|
{
|
||||||
|
[Key]
|
||||||
|
[MaxLength(100)]
|
||||||
|
public string sns_id {get; set;}
|
||||||
|
[MaxLength(70)]
|
||||||
|
public string uid {get; set;}
|
||||||
|
[MaxLength(4)]
|
||||||
|
public string sns_type {get; set;}
|
||||||
|
[MaxLength(255)]
|
||||||
|
public string sns_token {get; set;}
|
||||||
|
[MaxLength(100)]
|
||||||
|
public string sns_email {get; set;}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Table("user_academy")]
|
||||||
|
public class User_Academy
|
||||||
|
{
|
||||||
|
[Key]
|
||||||
|
public string uid { get; set; }
|
||||||
|
public string bid { get; set; }
|
||||||
|
public DateTime register_date { get; set; }
|
||||||
|
public bool status { get; set; }
|
||||||
|
}
|
|
@ -1,150 +0,0 @@
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
|
||||||
using System.Runtime.InteropServices.JavaScript;
|
|
||||||
|
|
||||||
namespace AcaMate.V1.Models;
|
|
||||||
|
|
||||||
[Table("login")]
|
|
||||||
public class Login
|
|
||||||
{
|
|
||||||
[Key]
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
[MaxLength(100)]
|
|
||||||
public string sns_id {get; set;}
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
[MaxLength(70)]
|
|
||||||
public string uid {get; set;}
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
[MaxLength(4)]
|
|
||||||
public string sns_type {get; set;}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Table("user_academy")]
|
|
||||||
public class User_Academy
|
|
||||||
{
|
|
||||||
[Key]
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string uid { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string bid { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public DateTime register_date { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public bool status { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[Table("user")]
|
|
||||||
public class User
|
|
||||||
{
|
|
||||||
[Key]
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string uid { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string name { get; set; }
|
|
||||||
public DateTime? birth { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string type { get; set; }
|
|
||||||
|
|
||||||
public string? device_id { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public bool auto_login_yn { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public DateTime login_date { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[Table("permission")]
|
|
||||||
public class Permission
|
|
||||||
{
|
|
||||||
[Key]
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string uid { get; set; }
|
|
||||||
|
|
||||||
public bool location_yn {get; set;}
|
|
||||||
public bool camera_yn {get; set;}
|
|
||||||
public bool photo_yn {get; set;}
|
|
||||||
public bool push_yn {get; set;}
|
|
||||||
public bool market_app_yn {get; set;}
|
|
||||||
public bool market_sms_yn {get; set;}
|
|
||||||
public bool market_email_yn {get; set;}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[Table("location")]
|
|
||||||
public class Location
|
|
||||||
{
|
|
||||||
[Key]
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string uid { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string lat { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string lng { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[Table("contact")]
|
|
||||||
public class Contact
|
|
||||||
{
|
|
||||||
[Key]
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string uid { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string email { get; set; }
|
|
||||||
public string? phone { get; set; }
|
|
||||||
public string? address { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// -- -- -- -- -- DB 테이블 -- -- -- -- -- //
|
|
||||||
|
|
||||||
public class UserAll
|
|
||||||
{
|
|
||||||
// [Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
// public string uid { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string name { get; set; }
|
|
||||||
|
|
||||||
public DateTime? birth { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string type { get; set; }
|
|
||||||
|
|
||||||
public string? device_id { get; set; }
|
|
||||||
|
|
||||||
public bool auto_login_yn { get; set; }
|
|
||||||
public DateTime login_date { get; set; }
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string email { get; set; }
|
|
||||||
public string? phone { get; set; }
|
|
||||||
public string? address { get; set; }
|
|
||||||
|
|
||||||
public bool location_yn {get; set;}
|
|
||||||
public bool camera_yn {get; set;}
|
|
||||||
public bool photo_yn {get; set;}
|
|
||||||
public bool push_yn {get; set;}
|
|
||||||
public bool market_app_yn {get; set;}
|
|
||||||
public bool market_sms_yn {get; set;}
|
|
||||||
public bool market_email_yn {get; set;}
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string sns_id {get; set;}
|
|
||||||
|
|
||||||
[Required(ErrorMessage = "필수 항목 누락")]
|
|
||||||
public string sns_type {get; set;}
|
|
||||||
}
|
|
|
@ -1,136 +0,0 @@
|
||||||
using AcaMate.Common.Data;
|
|
||||||
using AcaMate.Common.Token;
|
|
||||||
using AcaMate.Common.Models;
|
|
||||||
|
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using Microsoft.IdentityModel.Tokens;
|
|
||||||
|
|
||||||
namespace AcaMate.V1.Services;
|
|
||||||
|
|
||||||
public interface IRepositoryService
|
|
||||||
{
|
|
||||||
Task<bool> SaveData<T, K>(T entity, Expression<Func<T, K>> key) where T : class;
|
|
||||||
Task<ValidateToken> ValidateToken(string token, string refresh);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RepositoryService: IRepositoryService
|
|
||||||
{
|
|
||||||
private readonly AppDbContext _dbContext;
|
|
||||||
private readonly ILogger<RepositoryService> _logger;
|
|
||||||
private readonly JwtTokenService _jwtTokenService;
|
|
||||||
|
|
||||||
public RepositoryService(AppDbContext dbContext, ILogger<RepositoryService> logger, JwtTokenService jwtTokenService)
|
|
||||||
{
|
|
||||||
_dbContext = dbContext;
|
|
||||||
_logger = logger;
|
|
||||||
_jwtTokenService = jwtTokenService;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<bool> SaveData<T, K> (T entity, Expression<Func<T, K>> key) where T : class
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var value = key.Compile()(entity);
|
|
||||||
|
|
||||||
// x 라 함은 Expression 으로 생성되는 트리에서 T 타입으의 매개변수를 지칭함
|
|
||||||
var parameter = Expression.Parameter(typeof(T), "x");
|
|
||||||
|
|
||||||
var invokedExpr = Expression.Invoke(key, parameter);
|
|
||||||
var constantExpr = Expression.Constant(value, key.Body.Type);
|
|
||||||
var equalsExpr = Expression.Equal(invokedExpr, constantExpr);
|
|
||||||
|
|
||||||
var predicate = Expression.Lambda<Func<T, bool>>(equalsExpr, parameter);
|
|
||||||
|
|
||||||
var dbSet = _dbContext.Set<T>();
|
|
||||||
|
|
||||||
var entityData = await dbSet.FirstOrDefaultAsync(predicate);
|
|
||||||
|
|
||||||
if (entityData != null)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"[{typeof(T)}] 해당 PK 존재 [{value}]: 계속");
|
|
||||||
var entry = _dbContext.Entry(entityData);
|
|
||||||
entry.CurrentValues.SetValues(entity);
|
|
||||||
if (entry.Properties.Any(p => p.IsModified))
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"[{typeof(T)}] 변경사항 존재: 계속");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"[{typeof(T)}] 변경사항 없음: 종료");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"[{typeof(T)}] 처음등록");
|
|
||||||
dbSet.Add(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
_logger.LogInformation($"[{typeof(T)}] DB 저장 완료: 종료");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"[{typeof(T)}] 알 수 없는 오류: 종료 {ex}");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//토큰 태울때는 인코딩 된 걸로 태워야지 원본꺼 태우면 데이터에 손상옵니다.
|
|
||||||
public async Task<ValidateToken> ValidateToken(string token, string refresh)
|
|
||||||
{
|
|
||||||
var principalToken = _jwtTokenService.ValidateToken(token);
|
|
||||||
if (principalToken != null)
|
|
||||||
{
|
|
||||||
var uid = principalToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty;
|
|
||||||
_logger.LogInformation($"토큰 변환 - {uid}");
|
|
||||||
return new ValidateToken
|
|
||||||
{
|
|
||||||
token = token,
|
|
||||||
refresh = refresh,
|
|
||||||
uid = uid
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_logger.LogInformation("엑세스 토큰 만료");
|
|
||||||
var refreshToken = await _dbContext.RefreshTokens
|
|
||||||
.FirstOrDefaultAsync(t => t.refresh_token == refresh);
|
|
||||||
if (refreshToken == null)
|
|
||||||
{
|
|
||||||
throw new SecurityTokenException("리프레시 토큰도 잘못되었음");
|
|
||||||
}
|
|
||||||
var uid = refreshToken.uid;
|
|
||||||
|
|
||||||
if (refreshToken.expire_date > DateTime.Now)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"리프레시 : {uid}");
|
|
||||||
var access = _jwtTokenService.GenerateJwtToken(uid);
|
|
||||||
return new ValidateToken
|
|
||||||
{
|
|
||||||
token = access,
|
|
||||||
refresh = refreshToken.refresh_token,
|
|
||||||
uid = uid
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
|
|
||||||
_logger.LogInformation("리프레시 토큰 만료");
|
|
||||||
await SaveData<RefreshToken, string>(refreshToken, rt => rt.uid);
|
|
||||||
return new ValidateToken
|
|
||||||
{
|
|
||||||
token = token,
|
|
||||||
refresh = refreshToken.refresh_token,
|
|
||||||
uid = uid
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Warning",
|
"Default": "Information",
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -1,6 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg6emrDnIcwTOK1ukR
|
|
||||||
XP46LlSNM/isjoaaG78or+rl+iegCgYIKoZIzj0DAQehRANCAAQGw7HGRWmnAFPA
|
|
||||||
KUtVd8JTJp5ghjm6yV0EHmcbG7peM30MvirvBekankhkIFKQftqjsV7CY+MLKvmP
|
|
||||||
MBpKlcai
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
"Password" :"ZJ9G89X363"
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"ConnectionStrings": {
|
|
||||||
"MariaDbConnection": "server=ipstein.myds.me;port=8003;database=AcaMate;user=root;password=AcaMaterootPW;"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
{
|
|
||||||
"JwtSettings": {
|
|
||||||
"SecretKey": "QWNhTWF0ZS1TZWNyZXRLZXlfTWFkZUJ5J1RlYW0uU3RlaW5BbmRPd25lclNlYW5BbmRJbXBvcnRhbnRfTnVtYmVyLTk0MDUwOSE=",
|
|
||||||
"Issuer": "AcaMate",
|
|
||||||
"Audience": "https:/devacamate.ipstein.myds.me",
|
|
||||||
"ExpiryMinutes": 10,
|
|
||||||
"ClockSkewMinutes": 5,
|
|
||||||
"RefreshTokenExpiryDays": 7
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// SecretKey 의 길이는 최소 256bit(32byte)는 넘어야 함
|
|
|
@ -1,15 +0,0 @@
|
||||||
{
|
|
||||||
"JwtSettings": {
|
|
||||||
"SecretKey": "QWNhTWF0ZS1TZWNyZXRLZXlfTWFkZUJ5J1RlYW0uU3RlaW5BbmRPd25lclNlYW5BbmRJbXBvcnRhbnRfTnVtYmVyLTk0MDUwOSE=",
|
|
||||||
"Issuer": "AcaMate",
|
|
||||||
"Audience": "https://acamate.ipstein.myds.me",
|
|
||||||
// 엑세스 토큰 유효기간 (분)
|
|
||||||
"ExpiryMinutes": 10,
|
|
||||||
// 서버와 클라이언트 간 시간차이 보정 (분)
|
|
||||||
"ClockSkewMinutes": 5,
|
|
||||||
// 리프레시 토큰의 유효기간 (일)
|
|
||||||
"RefreshTokenExpiryDays": 7
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// SecretKey 의 길이는 최소 256bit(32byte)는 넘어야 함
|
|
||||||
// "SecretKey": "AcaMate-SecretKey_MadeBy'Team.SteinAndOwnerSeanAndImportant_Number-940509!",
|
|
Loading…
Reference in New Issue
Block a user