Menggunakan Django REST Framework Authentication

Persiapan Awal

Sama disini, API yang dibuat dapat diakses siapa saja. Kita perlu menambahkan authentication untuk mengatur hak pengguna API.

Karena ini bukan live project, kita akan hapus database db.sqlite3 dan file 0001_initial.py di migrations folder yang telah dibuat sebelumnya untuk memudahkan proses penambahan field user pada models.

Buka file backend/models.py, tambahkan field author seperti code dibawah:

from django.db import models
from django.contrib.auth.models import User

class Article (models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    slug = models.SlugField(max_length=200)
    published = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    
    def __str__(self):
        return self.title

Kemudian pada command prompt jalankan perintah migrations:

$ python manage.py makemigrations
$ python manage.py migrate

Selanjutnya kita buat superuser:

$ python manage.py createsuperuser

Masukan data yang diperlukan untuk membuat superuser.

Untuk merapikan struktur API, buka file backend/urls.py, tambahkan ‘api/’ pada path.

from django.urls import path, include
from .views import ArticleViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('articles', ArticleViewSet, basename="articles")

urlpatterns = [
    path('api/', include(router.urls))   
]

Implementasi Authentication

Buka file settings.py, pada variable INSTALLED_APPS, tambahkan rest_framework.authtoken.

# ....
# truncated code...

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework.authtoken',
    'backend'
]

# truncated code...
# ....

Selanjutnya kita harus melakukan migrate

$ python manage.py migrate

Kemudian mengatur authentication schema, pada tutorial akan digunakan pendekatan global. Buka file settings.py, tambahkan code dibawah:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ]
}

Untuk permission, kita atur berdasarkan view. (Anda dapat atur melaui settings.py untuk global permission). Kita gunakan per view dengan pertimbangan, tidak semua view akan direstrict.

Buka file backend/views.py, gunakan kode dibawah:

Perhatian: jika Anda ingin implementasi authentication dan permission pada level object (lihat code yang diberi tanda komentar).

from .models import Article
from .serializers import ArticleSerializer

from rest_framework import viewsets
#from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    lookup_field = 'slug'
    
    #authentication_classes = (TokenAuthentication,)
    permission_classes = [IsAuthenticated]

Menambahkan Menu Login pada browseable API.

Anda dapat menambahkan link login pada browseable API untuk mekanisme login. Buka file djangoAPI/urls.py (file url project).

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('backend.urls')),
    path('api-auth', include('rest_framework.urls'))
]

Menghilangkan tampilan User pada browsable API window

JIka Anda login, saat menambah atau mengupdate article, akan muncul field author. Seperti gambar dibawah.

Anda dapat menyembunyikannya, karena, sudah jelas user yang login akan menjadi author. Buka file backend/serializers.py, ubah code seperti berikut:

from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    slug = serializers.SlugField(read_only=True)
    author = serializers.StringRelatedField()
    class Meta:
        model = Article
        fields = '__all__'

Kemudian pada file backend/views.py, tambahkan fungsi untuk mengambil data author

from .models import Article
from .serializers import ArticleSerializer

from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    lookup_field = 'slug'
    
    permission_classes = [IsAuthenticated]
    
    def perform_create(self, serializer):
        serializer.save(author = self.request.user)

Silakan bereksperimen dengan menambah user baru melalui django admin, lalu tambahkan artikel baru.

Sharing is caring: