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.