developer tip

Django Rest 프레임 워크 토큰 인증

copycodes 2020. 10. 31. 09:49
반응형

Django Rest 프레임 워크 토큰 인증


Django Rest Framework 가이드를 읽고 모든 튜토리얼을 완료했습니다. 모든 것이 합리적이고 제대로 작동하는 것 같았습니다. 설명대로 기본 및 세션 인증이 작동했습니다. http://django-rest-framework.org/api-guide

그러나 문서의 토큰 인증 부분으로 어려움을 겪고 있습니다. 약간 부족하거나 자습서만큼 깊이 들어 가지 않습니다.
http://django-rest-framework.org/api-guide/authentication/#tokenauthentication

사용자를 위해 토큰을 만들어야한다고 말하지만 models.py에서 어디에 있는지 명시합니까?

내 질문은 :

누군가가 문서의 토큰 인증 부분을 첫 번째 타이머에 대해 좀 더 잘 설명 할 수 있습니까?


아니요, models.py에는 없습니다. 모델 측면에서해야 할 일은 적절한 앱 ( rest_framework.authtoken)을 INSTALLED_APPS. 이는 사용자에게 외래 키가 지정된 토큰 모델을 제공합니다.

해야 할 일은 토큰 개체를 언제 어떻게 생성해야하는지 결정하는 것입니다. 앱에서 모든 사용자가 자동으로 토큰을 받습니까? 아니면 특정 승인 된 사용자 만? 아니면 그들이 특별히 요청할 때만?

모든 사용자가 항상 토큰을 가져야하는 경우 링크 한 페이지에 자동으로 생성하도록 신호를 설정하는 방법을 보여주는 코드 스 니펫이 있습니다.

@receiver(post_save, sender=User)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

( 이것을 어디에나 models.py 파일에 넣으면 Django 스레드가 시작될 때 등록됩니다)

토큰을 특정 시간에만 만들어야하는 경우보기 코드에서 적절한 시간에 토큰을 만들고 저장해야합니다.

# View Pseudocode
from rest_framework.authtoken.models import Token

def token_request(request):
    if user_requested_token() and token_request_is_warranted():
        new_token = Token.objects.create(user=request.user)

토큰이 생성 (및 저장)되면 인증에 사용할 수 있습니다.


@ ian-clelland는 이미 정답을 제공했습니다. 그의 게시물에서 언급되지 않은 작은 부분이 몇 개 있으므로 전체 절차를 문서화하겠습니다 (Django 1.8.5 및 DRF 3.2.4 사용).

  1. 수퍼 유저를 만들기 전에 다음 작업을 수행 하십시오. 그렇지 않으면 수퍼 유저가 자신의 토큰을 생성하지 못합니다.

  2. settings.py로 이동 하여 다음을 추가하십시오.

    INSTALLED_APPS = (
        'rest_framework',
        'rest_framework.authtoken',
        'myapp',
    )
    
    REST_FRAMEWORK = {
        'DEFAULT_PERMISSION_CLASSES': (
            'rest_framework.permissions.IsAuthenticated',
        ),
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.TokenAuthentication',
        )
    }
    
  3. myappmodels.py 에 다음 코드를 추가하십시오 .

    from django.db.models.signals import post_save
    from django.dispatch import receiver
    from rest_framework.authtoken.models import Token
    from django.conf import settings
    
    # This code is triggered whenever a new user has been created and saved to the database
    @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 아래 의 MyApp 프로젝트를. 위의 코드를 그 안에 넣은 다음 __init__.py에 다음을 작성하십시오.import signals

  4. 콘솔 창을 열고 프로젝트 디렉토리로 이동 한 후 다음 명령을 입력합니다.

    python manage.py migrate
    python manage.py makemigrations
    

    데이터베이스를 살펴보면 key (토큰 값), created (생성 된 날짜 시간), user_id (auth_user 테이블의 id 열을 참조하는 외래 키) 필드로 authtoken_token 이라는 테이블 이 생성되어야합니다.

  5. 를 사용하여 수퍼 유저를 만듭니다 python manage.py createsuperuser. 이제 를 사용하여 DB authtoken_token 테이블을 살펴보면 select * from authtoken_token;새 항목이 추가 된 것을 볼 수 있습니다.

  6. 사용 curl또는 훨씬 간단한 대안 httpie 당신의 API에 대한 테스트 액세스, 나는 httpie을 사용하고 있습니다 :

    http GET 127.0.0.1:8000/whatever 'Authorization: Token your_token_value'
    

    그게 다야. 이제부터 모든 API 액세스에 대해 HTTP 헤더에 다음 값을 포함해야합니다 ( 공백에주의 ).

    Authorization: Token your_token_value
    
  7. (선택 사항) DRF는 사용자 이름과 암호를 제공하는 경우 사용자 토큰을 반환하는 기능도 제공합니다. urls.py에 다음을 포함하기 만하면됩니다 .

    from rest_framework.authtoken import views
    
    urlpatterns = [
        ...
        url(r'^api-token-auth/', views.obtain_auth_token),
    ]
    

    httpie를 사용하여 확인 :

    http POST 127.0.0.1:8000/api-token-auth/ username='admin' password='whatever'
    

    반환 본문에 다음이 표시되어야합니다.

    {
        "token": "blah_blah_blah"
    }
    

그게 다야!


Django 1.8.2 및 나머지 프레임 워크 3.3.2에서 위의 모든 사항을 따르는 것은 토큰 기반 인증을 활성화하기에 충분하지 않았습니다.

REST_FRAMEWORK 설정이 django 설정 파일에 지정되어 있지만 함수 기반 뷰에는 @api_view 데코레이터가 필요합니다.

from rest_framework.decorators import api_view

@api_view(['POST','GET'])
def my_view(request):
    if request.user.is_authenticated():
       ...

Otherwise no token authentication is performed at all


Just to add my two cents to this, if you've got a custom user manager that handles user creation (and activation), you may also perform this task like so:

from rest_framework.authtoken.models import Token
# Other imports

class UserManager(BaseUserManager):

    def create_user(self, **whatever_else):
        """
        This is your custom method for creating user instances. 
        IMHO, if you're going to do this, you might as well use a signal.

        """
        user = self.model(**whatever_params)
        .... #Method ramblings that somehow gave us a user instance
        Token.objects.create(user=user)

    #You may also choose to handle this upon user activation. 
    #Again, a signal works as well here.

    def activate_user(**activation_ramblings):
        .... #Method ramblings that somehow gave us a user instance
        Token.objects.create(user=user)

If you already have users created, then you may drop down into the python shell in your terminal and create Tokens for all the users in your db.

>>>from *whatever import User
>>>from rest_framework.authtoken.models import Token 
>>>for user in User.objects.all():
>>>...    Token.objects.create(user=user)

That's all she wrote folks! Hope that helps someone.


There is a cleaner way to get the user token.

simply run manage.py shell

and then

from rest_framework.authtoken.models import Token
from django.contrib.auth.models import User
u = User.objects.get(username='admin')
token = Token.objects.create(user=u)
print token.key

then a record should be found in table DB_Schema.authtoken_token


In addition to the excellent answers here, I'd like to mention a better approach to token authentication: JSON Web Token Authentication. The implementation offered by http://getblimp.github.io/django-rest-framework-jwt/ is very easy to use.

The benefits are explained in more detail in this answer.


JSON Web Token Authentication is a better alternative than Token Authentication. This project has implemented JWT Auth with Django (http://getblimp.github.io/django-rest-framework-jwt/) but currently the project is unmaintained.

For alternatives you can follow : https://github.com/davesque/django-rest-framework-simplejwt

참고URL : https://stackoverflow.com/questions/14838128/django-rest-framework-token-authentication

반응형