Blog FQSoft

Just Simple Code Documentation

Python Django

Django REST API Authentication

Faiq Himmah 11 February 2024
[ Gambar Post ]

Pada tutorial ini kita akan menggunakan package Django Rest Framework untuk REST API. Package ini menawarkan banyak metode authentication API. Mulai dari basic authentication sampai mendukung third party authentication. Untuk lebih jelasnya bisa kunjungi laman ini.

Namun pada tutorial ini kita akan mencoba menggunakan Token Authetication. Sebelumnya install dulu package Django Rest Framework jika belum terinstall caranya disini

Setup Token Authentication

Tambahkan kode ini pada file settings.py

INSTALLED_APPS = [
    ...
    'rest_framework.authtoken'
]

Pada tutorial ini kita akan membuat 3 method yaitu:

  • login()
  • logout()
  • getData()

buka file views.py dan tambahkan import modul seperti dibawah ini

from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from django.contrib.auth import authenticate
from rest_framework.authtoken.models import Token
from rest_framework.views import APIView

class MyAuth():

    @api_view(['POST'])
    def login(request):
        token = "None"
        user = authenticate(request,username=request.POST.get("username",""),password=request.POST.get("password",""))
        if user is not None:
            token = Token.objects.get_or_create(user=user)
            data = {
                'token': token[0].key,
                'status': user.is_authenticated
            }
            return Response(data=data)
        return Response(data=token)

    @api_view(['DELETE'])
    @authentication_classes([TokenAuthentication])
    @permission_classes([IsAuthenticated])
    def logout(request):
        Token.objects.filter(user=request.user).delete()
        return Response(data={
            'status': '200',
            'pesan': 'Logout Berhasil'
        })
    
    @api_view(['GET'])
    @authentication_classes([TokenAuthentication])
    @permission_classes([IsAuthenticated])
    def getData(request):
        app = [
            {
                "nama": request.user.email,
                "alamat": "Surabaya"
            },
            {
                "nama": "Sulaiman",
                "alamat": "Malang"
            }
        ]
        return Response(data=app)

Penjelasan Kode

login(request)

  • @api_view Untuk menentukan HTTP method
  • Method getLogin(request) untuk memproses login menggunakan username dan password dengan output berupa genarating token
  • if user is not None untuk mengecek apakah login berhasil atau tidak
  • function authenticate() berfungsi untuk memproses login. Dan jika tidak ada kendala maka akan return User Object yang disimpan oleh variable user
  • Token.objects.get_or_create(user=user) adalah code untuk membuat atau mengambil token bagi user yang login. Sehingga ketika token sudah tersedia maka sistem hanya mengambil saja tanpa perlu membuat token yang baru. dan token disimpan oleh variable token
  • token[0].key untuk mengkases key token

logout(request)

  • @api_view Untuk menentukan HTTP method
  • @authentication_classes([TokenAuthentication] Decorator ini berfungsi untuk membaca Authorization Header pada HTTP. Jika header ini tidak ada maka method tidak bisa dijalankan.
  • @permission_classes Decorator ini berfungsi untuk memastikan bahwa user sudah ter-autentikasi
  • Token.objects.filter(user=request.user).delete() Befungsi untuk menghapus token berdasar user yang login

getData(request)

  • @api_view Untuk menentukan HTTP method
  • @authentication_classes([TokenAuthentication] Decorator ini berfungsi untuk membaca Authorization Header pada HTTP. Jika header ini tidak ada maka method tidak bisa dijalankan.
  • @permission_classes Decorator ini berfungsi untuk memastikan bahwa user sudah ter-autentikasi
  • Method getData(request) adalah method tester untuk menguji sebuah method dijalankan dengan mekanisme REST API Authentication
  • request.user.email saat user sudah terautentikasi maka variabel request.user berisi object User jika tidak terautentikasi maka bersi AnonymousUser

Format Token Authorization

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

Menggunakan prefix Token dan 1 spasi. Lalu bagaimana cara mengubah menjadi prefix Bearer ? maka caranya adalah membuat subclass dari TokenAuthentication dan mengisi variable keyword berisi Bearer

class BearerToken(TokenAuthentication):
    keyword = "Bearer"

Diatas kita membuat subclass dari TokenAuthentication dengan nama subclass BearerToken. dan mengganti variable keyword berisi Bearer.

Selanjutnya parameter untuk decorator @authentication_classes ganti dengan subclass-nya yaitu BearerToken.

Membuat URL

from django.urls import path
from nama_app.views import MyAuth as v
urlpatterns = [
    path('data/',v.getData, name='data'),
    path('login/',v.getLogin, name='login'),
    path('logout/',v.getLogout, name='logout')
]

Untuk menguji REST API kita bisa menggunakan aplikasi POSTMAN

Semoga bermanfaat dan Terima kasih.......

Sumber : https://www.django-rest-framework.org/api-guide/authentication/

api python django