Compare commits
11 Commits
v0.0.12
...
e4b185332b
| Author | SHA1 | Date | |
|---|---|---|---|
| e4b185332b | |||
| b973522477 | |||
| 64032861e0 | |||
| ec866f2d05 | |||
| 89c126b469 | |||
| 118398fa68 | |||
| 05f4ed5b2a | |||
| ec39ba59be | |||
| cf8466aaf6 | |||
| ef7837b276 | |||
| 4e02b68d8a |
4
.gitignore
vendored
4
.gitignore
vendored
@ -165,4 +165,6 @@ _media/cluster/
|
|||||||
wheelhouse
|
wheelhouse
|
||||||
|
|
||||||
# RS256 을 위한 적용 keys 폴더
|
# RS256 을 위한 적용 keys 폴더
|
||||||
keys
|
keys
|
||||||
|
|
||||||
|
msa-django-auth.code-workspace
|
||||||
@ -1,5 +1,5 @@
|
|||||||
# pull official base image
|
# pull official base image
|
||||||
FROM python:3.10-slim-buster
|
FROM python:3.10-slim-bullseye
|
||||||
|
|
||||||
# set work directory
|
# set work directory
|
||||||
WORKDIR /usr/src/app
|
WORKDIR /usr/src/app
|
||||||
|
|||||||
14
README.md
14
README.md
@ -12,6 +12,20 @@ python3 manage.py runserver 0.0.0.0:8000
|
|||||||
gunicorn auth_prj.wsgi:application --bind 0.0.0.0:8000 --workers 3
|
gunicorn auth_prj.wsgi:application --bind 0.0.0.0:8000 --workers 3
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 2025-12-05 TRACE ENDPOINT 변경 ( v0.0.15 )
|
||||||
|
* 변경전 static
|
||||||
|
* 변경후 변수 처리
|
||||||
|
* TRACE_ENDPOINT='test'
|
||||||
|
* TRACE_SERVICE_NAME=''
|
||||||
|
|
||||||
|
## 2025-09-29 jaeger Endpoint 변경 ( v0.0.14 )
|
||||||
|
* 변경전: endpoint="http://jaeger-collector.istio-system:4317",
|
||||||
|
* 변경후: endpoint="http://jaeger-collector.observability.svc.cluster.local:4317",
|
||||||
|
|
||||||
|
## 2025-09-28 RS256변경 적용 ( v0.0.13 )
|
||||||
|
* Docker Build base image 변경.
|
||||||
|
* python:3.10-slim-buster > python:3.10-slim-bullseye
|
||||||
|
|
||||||
## 2025-09-28 RS256변경 적용 ( v0.0.12 )
|
## 2025-09-28 RS256변경 적용 ( v0.0.12 )
|
||||||
* 비대칭키 방식 → Private Key로 서명, Public Key로 검증.
|
* 비대칭키 방식 → Private Key로 서명, Public Key로 검증.
|
||||||
* 토큰 발급 서버는 Private Key만 보관.
|
* 토큰 발급 서버는 Private Key만 보관.
|
||||||
|
|||||||
@ -34,6 +34,9 @@ else:
|
|||||||
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
SECRET_KEY = os.environ.get('SECRET_KEY', 'django-insecure-ec9me^z%x7-2vwee5#qq(kvn@^cs!!22_*f-im(320_k5-=0j5')
|
SECRET_KEY = os.environ.get('SECRET_KEY', 'django-insecure-ec9me^z%x7-2vwee5#qq(kvn@^cs!!22_*f-im(320_k5-=0j5')
|
||||||
|
SERVICE_PLATFORM = os.getenv("SERVICE_PLATFORM", "none")
|
||||||
|
TRACE_SERVICE_NAME = os.getenv("TRACE_SERVICE_NAME", "msa-django-auth")
|
||||||
|
TRACE_ENDPOINT = os.getenv("TRACE_ENDPOINT", "none")
|
||||||
|
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
DEBUG = int(os.environ.get('DEBUG', 1))
|
DEBUG = int(os.environ.get('DEBUG', 1))
|
||||||
|
|||||||
@ -27,14 +27,22 @@ if not settings.DEBUG:
|
|||||||
trace.set_tracer_provider(
|
trace.set_tracer_provider(
|
||||||
TracerProvider(
|
TracerProvider(
|
||||||
resource=Resource.create({
|
resource=Resource.create({
|
||||||
"service.name": "msa-django-auth",
|
"service.platform": settings.SERVICE_PLATFORM,
|
||||||
|
# "service.name": "msa-django-auth",
|
||||||
|
"service.name": settings.TRACE_SERVICE_NAME,
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
otlp_exporter = OTLPSpanExporter(
|
otlp_exporter = OTLPSpanExporter(
|
||||||
endpoint="http://jaeger-collector.istio-system:4317",
|
# endpoint="http://jaeger-collector.istio-system:4317",
|
||||||
|
# endpoint="jaeger-collector.observability.svc.cluster.local:4317",
|
||||||
|
endpoint=settings.TRACE_ENDPOINT,
|
||||||
insecure=True,
|
insecure=True,
|
||||||
|
headers={
|
||||||
|
"X-Scope-OrgID": settings.SERVICE_PLATFORM,
|
||||||
|
"X-Service": settings.TRACE_SERVICE_NAME
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
trace.get_tracer_provider().add_span_processor(
|
trace.get_tracer_provider().add_span_processor(
|
||||||
|
|||||||
@ -0,0 +1,38 @@
|
|||||||
|
# Generated by Django 4.2.14 on 2026-01-12 16:16
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('users', '0006_customuser_encrypted_private_key_name'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='customuser',
|
||||||
|
name='address',
|
||||||
|
field=models.CharField(blank=True, max_length=500, null=True, verbose_name='주소'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='customuser',
|
||||||
|
name='birth_date',
|
||||||
|
field=models.DateField(blank=True, null=True, verbose_name='생년월일'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='customuser',
|
||||||
|
name='education',
|
||||||
|
field=models.CharField(blank=True, choices=[('high_school', '고등학교 졸업'), ('associate', '전문학사'), ('bachelor', '학사'), ('master', '석사'), ('doctor', '박사'), ('other', '기타')], max_length=20, null=True, verbose_name='학력'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='customuser',
|
||||||
|
name='gender',
|
||||||
|
field=models.CharField(blank=True, choices=[('M', '남성'), ('F', '여성'), ('O', '기타')], max_length=1, null=True, verbose_name='성별'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='customuser',
|
||||||
|
name='phone',
|
||||||
|
field=models.CharField(blank=True, max_length=20, null=True, verbose_name='전화번호'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -35,11 +35,33 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
|
|||||||
('user', '일반 사용자'),
|
('user', '일반 사용자'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
GENDER_CHOICES = (
|
||||||
|
('M', '남성'),
|
||||||
|
('F', '여성'),
|
||||||
|
('O', '기타'),
|
||||||
|
)
|
||||||
|
|
||||||
|
EDUCATION_CHOICES = (
|
||||||
|
('high_school', '고등학교 졸업'),
|
||||||
|
('associate', '전문학사'),
|
||||||
|
('bachelor', '학사'),
|
||||||
|
('master', '석사'),
|
||||||
|
('doctor', '박사'),
|
||||||
|
('other', '기타'),
|
||||||
|
)
|
||||||
|
|
||||||
email = models.EmailField(unique=True)
|
email = models.EmailField(unique=True)
|
||||||
name = models.CharField(max_length=255)
|
name = models.CharField(max_length=255)
|
||||||
grade = models.CharField(max_length=20, choices=GRADE_CHOICES, default='user')
|
grade = models.CharField(max_length=20, choices=GRADE_CHOICES, default='user')
|
||||||
desc = models.TextField(blank=True, null=True, verbose_name="설명")
|
desc = models.TextField(blank=True, null=True, verbose_name="설명")
|
||||||
|
|
||||||
|
# 추가 회원 정보 (선택)
|
||||||
|
phone = models.CharField(max_length=20, blank=True, null=True, verbose_name="전화번호")
|
||||||
|
address = models.CharField(max_length=500, blank=True, null=True, verbose_name="주소")
|
||||||
|
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, blank=True, null=True, verbose_name="성별")
|
||||||
|
birth_date = models.DateField(blank=True, null=True, verbose_name="생년월일")
|
||||||
|
education = models.CharField(max_length=20, choices=EDUCATION_CHOICES, blank=True, null=True, verbose_name="학력")
|
||||||
|
|
||||||
is_active = models.BooleanField(default=False)
|
is_active = models.BooleanField(default=False)
|
||||||
is_staff = models.BooleanField(default=False)
|
is_staff = models.BooleanField(default=False)
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
|||||||
@ -8,7 +8,8 @@ class RegisterSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = CustomUser
|
model = CustomUser
|
||||||
fields = ("email", "name", "password", "grade", "desc")
|
fields = ("email", "name", "password", "grade", "desc",
|
||||||
|
"phone", "address", "gender", "birth_date", "education")
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
password = validated_data.pop("password")
|
password = validated_data.pop("password")
|
||||||
@ -27,6 +28,7 @@ class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
|
|||||||
token["name"] = user.name
|
token["name"] = user.name
|
||||||
token["grade"] = user.grade
|
token["grade"] = user.grade
|
||||||
token["email"] = user.email # 선택적으로 추가 가능
|
token["email"] = user.email # 선택적으로 추가 가능
|
||||||
|
token["sub"] = user.email # 선택적으로 추가 가능
|
||||||
|
|
||||||
# Kong JWT 플러그인용 issuer 정보 추가
|
# Kong JWT 플러그인용 issuer 정보 추가
|
||||||
token["iss"] = "msa-user"
|
token["iss"] = "msa-user"
|
||||||
|
|||||||
Reference in New Issue
Block a user