å ç¢ãªèªèšŒã§Django REST Framework APIãä¿è·ããŸããããããŒã¯ã³èªèšŒãšJWT (JSON Web Token) ã®å®è£ ããå®çšçãªã³ãŒãäŸãšãã¹ããã©ã¯ãã£ã¹ã亀ããŠæ¯èŒããŸãã
Python DRFèªèšŒ: å ç¢ãªAPIã®ããã®ããŒã¯ã³èªèšŒ vs. JWTå®è£
APIãä¿è·ããããšã¯æãéèŠã§ããPythonãšDjango REST Framework (DRF) ã䜿çšããŠAPIãæ§ç¯ããå Žåãããã€ãã®èªèšŒãªãã·ã§ã³ãå©çšå¯èœã§ãããã®èšäºã§ã¯ã2ã€ã®äººæ°ã®ããæ¹æ³ãããŒã¯ã³èªèšŒãšJWT (JSON Web Token) èªèšŒã«ã€ããŠæ·±ãæãäžããããããã®é·æãšçæãæ¯èŒããå®è·µçãªå®è£ äŸãæäŸããŸãã
APIã«ãããèªèšŒã®çè§£
èªèšŒãšã¯ãAPIã«ã¢ã¯ã»ã¹ãããŠãŒã¶ãŒãŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®èº«å ã確èªããããã»ã¹ã§ããé©åã«å®è£ ãããèªèšŒã·ã¹ãã ã¯ãèš±å¯ããããšã³ãã£ãã£ã®ã¿ãä¿è·ããããªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããããšãä¿èšŒããŸããRESTful APIã®ã³ã³ããã¹ãã§ã¯ãèªèšŒã¯éåžžãåãªã¯ãšã¹ããšãšãã«è³æ Œæ å ± (äŸ: ãŠãŒã¶ãŒåãšãã¹ã¯ãŒã) ãéä¿¡ããããšãå«ã¿ãŸãããµãŒããŒã¯ãããã®è³æ Œæ å ±ãæ€èšŒããæå¹ã§ããã°ã¢ã¯ã»ã¹ãèš±å¯ããŸãã
ããŒã¯ã³èªèšŒ
ããŒã¯ã³èªèšŒã¯ãã·ã³ãã«ã§åãããããã¡ã«ããºã ã§ãããŠãŒã¶ãŒãæ£åžžã«ãã°ã€ã³ãããšããµãŒããŒã¯äžæã®ã©ã³ãã ãªããŒã¯ã³ãçæããããããŠãŒã¶ãŒã«é¢é£ä»ããŠããŒã¿ããŒã¹ã«ä¿åããŸããã¯ã©ã€ã¢ã³ãã¯ãã®åŸããã®ããŒã¯ã³ãåŸç¶ã®ãªã¯ãšã¹ãã®ãAuthorizationãããããŒã«å«ããŠéä¿¡ããŸãããµãŒããŒã¯ããŒã¿ããŒã¹ããããŒã¯ã³ãååŸãããã®æå¹æ§ãæ€èšŒããŠãããã«å¿ããŠã¢ã¯ã»ã¹ãèš±å¯ããŸãã
DRFã§ã®å®è£
DRFã¯ããŒã¯ã³èªèšŒã®ããã®çµã¿èŸŒã¿ãµããŒããæäŸããŠããŸãã以äžã«ãã®å®è£ æ¹æ³ã瀺ããŸãã
- DRFãã€ã³ã¹ããŒã«ããDjangoãããžã§ã¯ãã«ç»é²ãã:
ãŸããDjango REST Frameworkãã€ã³ã¹ããŒã«ãããŠããããšã確èªããŠãã ããã
pip install djangorestframework
次ã«ã`settings.py`ã®`INSTALLED_APPS`ã«è¿œå ããŸãã
INSTALLED_APPS = [
...
'rest_framework',
]
- TokenAuthenticationã¹ããŒã ãããã©ã«ãã®èªèšŒã¯ã©ã¹ãšããŠè¿œå ãã (ä»»æã ãæšå¥š):
`settings.py`ãã¡ã€ã«ã«ã以äžã远å ããŸãã
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
}
ããã«ãããAPIå šäœã«ããŒã¯ã³èªèšŒãã°ããŒãã«ã«é©çšãããŸãã`SessionAuthentication`ã¯ãã©ãŠã¶ããŒã¹ã®å¯Ÿè©±ã®ããã«å«ãŸããŠããŸãããçŽç²ãªAPIé§ååã¢ããªã±ãŒã·ã§ã³ã®å Žåã¯åé€ã§ããŸãã
- åãŠãŒã¶ãŒã®ããŒã¯ã³ãäœæãã:
ãŠãŒã¶ãŒäœææã«ã·ã°ãã«ãã³ãã©ãŒã远å ããããšã§ãèªåçã«ããŒã¯ã³ãäœæã§ããŸããã¢ããªå ã«`signals.py`ãšãããã¡ã€ã«ãäœæããŸã (äŸ: `users/signals.py`)ã
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
次ã«ããã®`signals.py`ãã¡ã€ã«ããã¢ããªã®æ§æã¯ã©ã¹ã®`ready`ã¡ãœããå ã§`users/apps.py`ãã¡ã€ã«ã«ã€ã³ããŒãããŸãã`users/apps.py`ã®äŸ:
from django.apps import AppConfig
class UsersConfig(AppConfig):
default_auto_field = 'django.db.BigAutoField'
name = 'users'
def ready(self):
import users.signals
ããã§ãã³ãã³ãã©ã€ã³ã䜿çšããŠããŒã¯ã³ã管çã§ããŸãã
python manage.py drf_create_token <username>
- APIãã¥ãŒãå®è£ ãã:
ããŒã¯ã³èªèšŒãå¿ èŠãšãããã¥ãŒã®ç°¡åãªäŸã次ã«ç€ºããŸãã
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView
class ExampleView(APIView):
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
def get(self, request):
content = {
'message': 'Hello, ' + request.user.username + '! You are authenticated.',
}
return Response(content)
ãã®äŸã§ã¯ã`authentication_classes`ã¯ããŒã¯ã³èªèšŒã䜿çšããå¿ èŠãããããšãæå®ãã`permission_classes`ã¯èªèšŒããããŠãŒã¶ãŒã®ã¿ããã¥ãŒã«ã¢ã¯ã»ã¹ã§ããããšãæå®ããŸãã
- ãã°ã€ã³APIãã¥ãŒãå«ãã:
ãã°ã€ã³æåæã«ããŒã¯ã³ãäœæããããã®ãšã³ããã€ã³ããå¿ èŠã§ãã
from django.contrib.auth import authenticate
from rest_framework import status
from rest_framework.authtoken.models import Token
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
@api_view(['POST'])
@permission_classes([AllowAny])
def login(request):
username = request.data.get('username')
password = request.data.get('password')
user = authenticate(username=username, password=password)
if user:
token, _ = Token.objects.get_or_create(user=user)
return Response({'token': token.key})
else:
return Response({'error': 'Invalid Credentials'}, status=status.HTTP_401_UNAUTHORIZED)
ããŒã¯ã³èªèšŒã®å©ç¹
- ã·ã³ãã«ã: å®è£ ãç°¡åã§çè§£ããããã
- ã¹ããŒãã¬ã¹: åããŒã¯ã³ãªã¯ãšã¹ãã¯ãããèªäœã§å®çµã§ããæ å ±ãå«ãã§ããŸãã
ããŒã¯ã³èªèšŒã®æ¬ ç¹
- ããŒã¿ããŒã¹ãžã®äŸå: ããŒã¯ã³ãæ€èšŒããããã«ãåãªã¯ãšã¹ãããšã«ããŒã¿ããŒã¹åç §ãå¿ èŠã§ããããã¯ãç¹ã«å€§èŠæš¡ãªå Žåã«ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- ããŒã¯ã³ã®å€±å¹: ããŒã¯ã³ã倱å¹ãããã«ã¯ãããŒã¿ããŒã¹ããåé€ããå¿ èŠããããè€éã«ãªãå ŽåããããŸãã
- ã¹ã±ãŒã©ããªãã£: ããŒã¿ããŒã¹ã®ãªãŒããŒãããã®ãããå€§èŠæš¡ã§é«ãã©ãã£ãã¯ãªAPIã«ã¯æãã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãªãå¯èœæ§ããããŸãã
JWT (JSON Web Token) èªèšŒ
JWTèªèšŒã¯ãããçŸä»£çã§æŽç·Žãããã¢ãããŒãã§ããJWTã¯ããŠãŒã¶ãŒã«é¢ããã¯ã¬ãŒã ãå«ãã³ã³ãã¯ãã§URLã»ãŒããªJSONãªããžã§ã¯ãã§ãããããã®ã¯ã¬ãŒã ã¯ãç§å¯éµãŸãã¯å ¬ééµ/ç§å¯éµã®ãã¢ã䜿çšããŠããžã¿ã«çœ²åãããŸãããŠãŒã¶ãŒããã°ã€ã³ãããšããµãŒããŒã¯JWTãçæããŠã¯ã©ã€ã¢ã³ãã«éä¿¡ããŸããã¯ã©ã€ã¢ã³ãã¯ãã®åŸããã®JWTãåŸç¶ã®ãªã¯ãšã¹ãã®ãAuthorizationãããããŒã«å«ããŸãããµãŒããŒã¯ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããããšãªãJWTã®çœ²åãæ€èšŒã§ãããããããå¹ççã§ã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ãšãªããŸãã
DRFã§ã®å®è£
DRFã¯JWTèªèšŒã®ããã®çµã¿èŸŒã¿ãµããŒããæäŸããŠããŸããããããã€ãã®åªããã©ã€ãã©ãªã«ããç°¡åã«çµ±åã§ããŸããæã人æ°ã®ãããã®ã®1ã€ã¯`djangorestframework-simplejwt`ã§ãã
- `djangorestframework-simplejwt`ãã€ã³ã¹ããŒã«ãã:
pip install djangorestframework-simplejwt
- DRFèšå®ãæ§æãã:
`settings.py`ãã¡ã€ã«ã«ã以äžã远å ããŸãã
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': True,
'ALGORITHM': 'HS256',
'SIGNING_KEY': settings.SECRET_KEY,
'VERIFYING_KEY': None,
'AUTH_HEADER_TYPES': ('Bearer',),
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
}
èšå®ã®èª¬æ:
- `ACCESS_TOKEN_LIFETIME`: ã¢ã¯ã»ã¹ããŒã¯ã³ãæå¹ãªæé (äŸ: 5å)ã
- `REFRESH_TOKEN_LIFETIME`: ãªãã¬ãã·ã¥ããŒã¯ã³ãæå¹ãªæé (äŸ: 1æ¥)ããªãã¬ãã·ã¥ããŒã¯ã³ã¯ããŠãŒã¶ãŒãå床ãã°ã€ã³ããããšãªãæ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãååŸããããã«äœ¿çšãããŸãã
- `ROTATE_REFRESH_TOKENS`: å䜿çšåŸã«ãªãã¬ãã·ã¥ããŒã¯ã³ãããŒããŒã·ã§ã³ãããã©ããã
- `BLACKLIST_AFTER_ROTATION`: ããŒããŒã·ã§ã³åŸã«å€ããªãã¬ãã·ã¥ããŒã¯ã³ããã©ãã¯ãªã¹ãã«å ¥ãããã©ããã
- `ALGORITHM`: JWTã®çœ²åã«äœ¿çšãããã¢ã«ãŽãªãºã (HS256ãäžè¬çãªéžæè¢ã§ã)ã
- `SIGNING_KEY`: JWTã®çœ²åã«äœ¿çšãããç§å¯éµ (éåžžã¯Djangoã®SECRET_KEY)ã
- `AUTH_HEADER_TYPES`: èªèšŒããããŒã®ã¿ã€ã (éåžžã¯ãBearerã)ã
- ãã°ã€ã³ããã³ãªãã¬ãã·ã¥ããŒã¯ã³APIãã¥ãŒãå«ãã:
`djangorestframework-simplejwt`ã¯ãããŒã¯ã³ãååŸããã³æŽæ°ããããã®ãã¥ãŒãæäŸããŸãããããã`urls.py`ã«å«ããŸãã
from django.urls import path
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
`TokenObtainPairView`ã¯ãèªèšŒæååŸã«ã¢ã¯ã»ã¹ããã³ãªãã¬ãã·ã¥ããŒã¯ã³ãæäŸããŸãã`TokenRefreshView`ã¯ãæå¹ãªãªãã¬ãã·ã¥ããŒã¯ã³ãæäŸããããšãã«æ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãæäŸããŸãã
- APIãã¥ãŒãå®è£ ãã:
JWTèªèšŒãå¿ èŠãšãããã¥ãŒã®ç°¡åãªäŸã次ã«ç€ºããŸãã
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_simplejwt.authentication import JWTAuthentication
class ExampleView(APIView):
authentication_classes = [JWTAuthentication]
permission_classes = [permissions.IsAuthenticated]
def get(self, request):
content = {
'message': 'Hello, ' + request.user.username + '! You are authenticated.',
}
return Response(content)
ããŒã¯ã³èªèšŒã®äŸãšåæ§ã«ã`authentication_classes`ã¯JWTèªèšŒã䜿çšããå¿ èŠãããããšãæå®ãã`permission_classes`ã¯èªèšŒããããŠãŒã¶ãŒã®ã¿ã«ã¢ã¯ã»ã¹ãå¶éããŸãã
JWTèªèšŒã®å©ç¹
- ã¹ã±ãŒã©ããªãã£: ããŒã¯ã³æ€èšŒã«ããŒã¿ããŒã¹åç §ãå¿ èŠãªããããããã¹ã±ãŒã©ãã«ã§ãã
- ã¹ããŒãã¬ã¹: JWTã¯èªèšŒã«å¿ èŠãªãã¹ãŠã®æ å ±ãå«ãã§ããŸãã
- æšæºåãããŠãã: JWTã¯åºãæ¡çšãããŠããæšæºã§ãããå€ãã®ã©ã€ãã©ãªããã©ãããã©ãŒã ã§ãµããŒããããŠããŸãã
- ãã€ã¯ããµãŒãã¹ã«é©ããŠãã: ãµãŒãã¹ãJWTãç¬ç«ããŠæ€èšŒã§ããããããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã«é©ããŠããŸãã
JWTèªèšŒã®æ¬ ç¹
- è€éã: ããŒã¯ã³èªèšŒãããå®è£ ãè€éã§ãã
- ããŒã¯ã³ãµã€ãº: JWTã¯ã·ã³ãã«ãªããŒã¯ã³ããã倧ãããªãå¯èœæ§ãããã垯åå¹ ã®äœ¿çšéãå¢å ããå¯èœæ§ããããŸãã
- ããŒã¯ã³ã®å€±å¹: JWTã®å€±å¹ã¯å°é£ã§ããäžåºŠçºè¡ããããšãæå¹æéãŸã§æå¹ã§ããåé¿çãšããŠã倱å¹ããããŒã¯ã³ããã©ãã¯ãªã¹ãåããããšãæããããŸãããããã«ããããŒã¿ããŒã¹ãžã®äŸåãåå°å ¥ãããŸãã
ããŒã¯ã³å€±å¹æŠç¥
ããŒã¯ã³èªèšŒãšJWTèªèšŒã®äž¡æ¹ã®æ¹æ³ã§ã¯ãã¢ã¯ã»ã¹ãåãæ¶ãããã®ã¡ã«ããºã ãå¿ èŠã§ããããŒã¯ã³å€±å¹ãžã®ã¢ãããŒãã¯æ¬¡ã®ãšããã§ãã
ããŒã¯ã³èªèšŒã®å€±å¹
ããŒã¯ã³èªèšŒã®å Žåã倱å¹ã¯ç°¡åã§ããããŒã¿ããŒã¹ããããŒã¯ã³ãåé€ããã ãã§ãã
from rest_framework.authtoken.models import Token
try:
token = Token.objects.get(user=request.user)
token.delete()
except Token.DoesNotExist:
pass
JWTèªèšŒã®å€±å¹
JWTã®å€±å¹ã¯ããè€éã§ãããªããªããããŒã¯ã³èªäœãèªå·±å®çµåã§ãããæ€èšŒã®ããã«ããŒã¿ããŒã¹åç §ã«äŸåããªã (åæçã«ã¯) ããã§ããäžè¬çãªæŠç¥ã«ã¯ä»¥äžãå«ãŸããŸãã
- ããŒã¯ã³ã®ãã©ãã¯ãªã¹ãå: 倱å¹ããããŒã¯ã³ããã©ãã¯ãªã¹ã (äŸ: ããŒã¿ããŒã¹ããŒãã«ãŸãã¯Redisãã£ãã·ã¥) ã«ä¿åããŸããJWTãæ€èšŒããåã«ããã©ãã¯ãªã¹ãã«ç»é²ãããŠãããã確èªããŸãã`djangorestframework-simplejwt`ã¯ããªãã¬ãã·ã¥ããŒã¯ã³ã®ãã©ãã¯ãªã¹ãåã®ããã®çµã¿èŸŒã¿ãµããŒããæäŸããŸãã
- çãæå¹æé: çãã¢ã¯ã»ã¹ããŒã¯ã³ã®æå¹æéã䜿çšãããªãã¬ãã·ã¥ããŒã¯ã³ã«äŸåããŠæ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãé »ç¹ã«ååŸããŸããããã«ããã䟵害ãããããŒã¯ã³ã䜿çšãããæ©äŒãå¶éããŸãã
- ãªãã¬ãã·ã¥ããŒã¯ã³ã®ããŒããŒã·ã§ã³: å䜿çšåŸã«ãªãã¬ãã·ã¥ããŒã¯ã³ãããŒããŒã·ã§ã³ããŸããããã«ãããå€ãããŒã¯ã³ãæ¯åç¡å¹ã«ãªããããŒã¯ã³çé£ãé²ããŸãã
OAuth2ãšOpenID Connect
ããè€éãªèªèšŒããã³èªå¯ã·ããªãªã§ã¯ãOAuth2ãšOpenID Connectã®äœ¿çšãæ€èšããŠãã ããããããã®æšæºã¯ãè³æ Œæ å ±ãå ±æããããšãªããªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå§ä»»ããããã®å ç¢ãªãã¬ãŒã ã¯ãŒã¯ãæäŸããŸããOAuth2ã¯äž»ã«èªå¯ãããã³ã«ã§ãããOpenID Connectã¯OAuth2ã®äžã«æ§ç¯ãããŠèªèšŒãµãŒãã¹ãæäŸããŸãã`django-oauth-toolkit`ã`django-allauth`ãªã©ã®ããã€ãã®Djangoããã±ãŒãžã¯ãOAuth2ãšOpenID ConnectãDRF APIã«çµ±åããã®ã容æã«ããŸãã
äŸã®ã·ããªãª: ãŠãŒã¶ãŒããAPIã«ä¿åãããŠããèªåã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ããµãŒãããŒãã£ã¢ããªã±ãŒã·ã§ã³ã«èš±å¯ããããšèããŠããŸããOAuth2ã䜿çšãããšããŠãŒã¶ãŒã¯ãŠãŒã¶ãŒåãšãã¹ã¯ãŒããå ±æããããšãªããã¢ããªã±ãŒã·ã§ã³ãæ¿èªã§ããŸãã代ããã«ãã¢ããªã±ãŒã·ã§ã³ã¯å®çŸ©ãããæš©éã®ç¯å²å ã§ãŠãŒã¶ãŒã®ããŒã¿ã«ã¢ã¯ã»ã¹ããããã«äœ¿çšã§ããã¢ã¯ã»ã¹ããŒã¯ã³ãåãåããŸãã
é©åãªèªèšŒæ¹æ³ã®éžæ
æé©ãªèªèšŒæ¹æ³ã¯ãç¹å®ã®èŠä»¶ã«ãã£ãŠç°ãªããŸãã
- å®è£ ã®ã·ã³ãã«ããšé床: ããŒã¯ã³èªèšŒã¯ãäžè¬çã«åæå®è£ ã容æã§ãã
- ã¹ã±ãŒã©ããªãã£: JWTèªèšŒã¯ãé«ãã©ãã£ãã¯ãªAPIã«å¯ŸããŠããã¹ã±ãŒã©ãã«ã§ãã
- ã»ãã¥ãªãã£èŠä»¶: ããŒã¿ã®æ©å¯æ§ãšå¿ èŠãªã»ãã¥ãªãã£ã¬ãã«ãèæ ®ããŠãã ãããOAuth2/OpenID Connectã¯æãå ç¢ãªã»ãã¥ãªãã£æ©èœãæäŸããŸãããããè€éãªå®è£ ãå¿ èŠã§ãã
- ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£: JWTã¯ãåãµãŒãã¹ãããŒã¯ã³ãç¬ç«ããŠæ€èšŒã§ããããããã€ã¯ããµãŒãã¹ã«é©ããŠããŸãã
APIèªèšŒã®ãã¹ããã©ã¯ãã£ã¹
- HTTPSã䜿çšãã: ã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®éä¿¡ãæå·åããããã«åžžã«HTTPSã䜿çšããè³æ Œæ å ±ãçèŽãããã®ãé²ããŸãã
- ã·ãŒã¯ã¬ãããå®å šã«ä¿ç®¡ãã: ç§å¯éµããã¹ã¯ãŒããå¹³æã§ä¿åããªãã§ãã ãããç°å¢å€æ°ãŸãã¯ã»ãã¥ã¢ãªæ§æç®¡çããŒã«ã䜿çšããŠãã ããã
- ã¬ãŒãå¶éãå®è£ ãã: ã¯ã©ã€ã¢ã³ããç¹å®ã®æéå ã«è¡ãããšãã§ãããªã¯ãšã¹ãã®æ°ãå¶éããã¬ãŒãå¶éãå®è£ ããŠãAPIãæªçšããä¿è·ããŸãã
- å ¥åãæ€èšŒãã: ã€ã³ãžã§ã¯ã·ã§ã³æ»æãé²ãããã«ããã¹ãŠã®å ¥åããŒã¿ã培åºçã«æ€èšŒããŸãã
- ç£èŠãšãã°èšé²: APIã®äžå¯©ãªã¢ã¯ãã£ããã£ãç£èŠããç£æ»ç®çã§èªèšŒã€ãã³ãããã°ã«èšé²ããŸãã
- ã©ã€ãã©ãªã宿çã«æŽæ°ãã: ã»ãã¥ãªãã£ããããšæ¹åã®æ©æµãåããããã«ãDjangoãDRFãããã³èªèšŒã©ã€ãã©ãªãææ°ã®ç¶æ ã«ä¿ã¡ãŸãã
- CORS (Cross-Origin Resource Sharing) ãå®è£ ãã: ä¿¡é Œã§ãããã¡ã€ã³ã®ã¿ãWebãã©ãŠã¶ããAPIã«ã¢ã¯ã»ã¹ã§ããããã«ãCORSãé©åã«æ§æããŸãã
çµè«
DRF APIãä¿è·ããããã«ã¯ãé©åãªèªèšŒæ¹æ³ãéžæããããšãéèŠã§ããããŒã¯ã³èªèšŒã¯ã·ã³ãã«ããæäŸããJWTèªèšŒã¯ã¹ã±ãŒã©ããªãã£ãšæè»æ§ãæäŸããŸããåæ¹æ³ã®é·æãšçæãããã³APIã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã§ãããŒã¿ãšãŠãŒã¶ãŒãä¿è·ããå ç¢ã§å®å šãªAPIãæ§ç¯ã§ããããã«ãªããŸãã
ç¹å®ã®ããŒãºãèæ ®ããã»ãã¥ãªãã£ãããã©ãŒãã³ã¹ãå®è£ ã®å®¹æãã®ãã©ã³ã¹ãæãåãããœãªã¥ãŒã·ã§ã³ãéžæããããšãå¿ããªãã§ãã ãããããè€éãªèªå¯ã·ããªãªã«ã¯ãOAuth2ãšOpenID Connectãæ€èšããŠãã ããã