django-tastypieでAPIにベーシック認証をかける

django-tastypieを使えば、Djangoでモデル定義されたデータへアクセスするAPIを簡単に作成することができます。

先日サンプルを作成してみましたが、認証がかかっていないため、APIは誰でも叩けてしまいます。これはよくないですね

どこのだれだかわからない人に一発で全データを消されてしまいます。

そこで認証をかける必要があります。django-tastypieには認証をかける方法も用意されています。

認証はいくつか用意されていますが、一番簡単そうなベーシンク認証をかける方法を試してみました。


ベーシック認証をかけるにはResourceのMetaクラスにauthentication = BasicAuthentication()を記述します
resources.py

from tastypie.authentication import BasicAuthentication
from tastypie.resources import ModelResource
from tastypie.authorization import Authorization
from app.models import Book

class BookResource(ModelResource):
    class Meta:
        queryset = Book.objects.all()
        authentication = BasicAuthentication() 
        authorization = Authorization()


認証に使われるuser/passはdjango.contrib.auth.models.Userのusernameとpasswordです。apiを利用するユーザーを作成しておきます。


requestsを使ったアクセス方法はこんな感じになります

import requests
from requests.auth import HTTPBasicAuth

# 取得
r = requests.get('http://localhost:8000/api/book/', auth=HTTPBasicAuth('user', 'pass'))
# もしくは
r = requests.get('http://localhost:8000/api/book/', auth=('user', 'pass'))

ちなみに

django-tastypieのドキュメントを見ると「Authentication」と「Authorization」の機能が用意されているのがわかります。


Authenticationは「APIの利用者」を制限する機能です。
例えば正しいkeyやuser/passを渡さないとAPIを使えないように制限します。


Authorizationは「APIの利用者が利用できる機能」を制限する機能です。
例えば、一般ユーザーはReadはできるけど、CreateやUpdateやDeleteはさせないように機能制限するなどです