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
|
||||
|
||||
# RS256 을 위한 적용 keys 폴더
|
||||
keys
|
||||
keys
|
||||
|
||||
msa-django-auth.code-workspace
|
||||
@ -1,5 +1,5 @@
|
||||
# pull official base image
|
||||
FROM python:3.10-slim-buster
|
||||
FROM python:3.10-slim-bullseye
|
||||
|
||||
# set work directory
|
||||
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
|
||||
```
|
||||
|
||||
## 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 )
|
||||
* 비대칭키 방식 → Private Key로 서명, Public Key로 검증.
|
||||
* 토큰 발급 서버는 Private Key만 보관.
|
||||
|
||||
@ -34,6 +34,9 @@ else:
|
||||
|
||||
# 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')
|
||||
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!
|
||||
DEBUG = int(os.environ.get('DEBUG', 1))
|
||||
|
||||
@ -27,14 +27,22 @@ if not settings.DEBUG:
|
||||
trace.set_tracer_provider(
|
||||
TracerProvider(
|
||||
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(
|
||||
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,
|
||||
headers={
|
||||
"X-Scope-OrgID": settings.SERVICE_PLATFORM,
|
||||
"X-Service": settings.TRACE_SERVICE_NAME
|
||||
}
|
||||
)
|
||||
|
||||
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', '일반 사용자'),
|
||||
)
|
||||
|
||||
GENDER_CHOICES = (
|
||||
('M', '남성'),
|
||||
('F', '여성'),
|
||||
('O', '기타'),
|
||||
)
|
||||
|
||||
EDUCATION_CHOICES = (
|
||||
('high_school', '고등학교 졸업'),
|
||||
('associate', '전문학사'),
|
||||
('bachelor', '학사'),
|
||||
('master', '석사'),
|
||||
('doctor', '박사'),
|
||||
('other', '기타'),
|
||||
)
|
||||
|
||||
email = models.EmailField(unique=True)
|
||||
name = models.CharField(max_length=255)
|
||||
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_staff = models.BooleanField(default=False)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
@ -8,7 +8,8 @@ class RegisterSerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
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):
|
||||
password = validated_data.pop("password")
|
||||
@ -27,6 +28,7 @@ class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
|
||||
token["name"] = user.name
|
||||
token["grade"] = user.grade
|
||||
token["email"] = user.email # 선택적으로 추가 가능
|
||||
token["sub"] = user.email # 선택적으로 추가 가능
|
||||
|
||||
# Kong JWT 플러그인용 issuer 정보 추가
|
||||
token["iss"] = "msa-user"
|
||||
|
||||
Reference in New Issue
Block a user