読者です 読者をやめる 読者になる 読者になる

Django REST frameworkでセキュリティレベルをview毎に

Django REST framework 使ってセキュリティを強くしてると、何かしらのセキュリティがないapi叩くにも以下のエラーが出ることがある。

{
    "detail": "Authentication credentials were not provided."
}

解決法

view単位なら、

from rest_framework import viewsets, filters, permissions
class HogeViewset(viewsets.ModelViewSet):
    queryset = Hoge.objects.all()
    serializer_class = HogeSerializer
    filter_fields = (...)
    @detail_route(methods=['get'],
                  permission_classes=[permissions.AllowAny],
                  url_path='piyo')
    def piyo(self, request, pk=None):
        ...

みたいな感じで解決した。これはdetail_routeでコレータを使用した場合の例です。permission_classesを指定してあげる。ちゃんと権限は適切に。

ちなみにViewSet単位なら

from rest_framework import viewsets, filters, permissions
class HogeViewset(viewsets.ModelViewSet):
    queryset = Hoge.objects.all()
    serializer_class = HogeSerializer
    filter_fields = (...)
    permission_classes=[permissions.AllowAny]

みたいにclassのフィールドに書き足す。

Django REST framework JWT特有の現象ではないが、僕はJWT扱ってるときに困った(それまでセキュリティを指定してなかったため突然弾かれるようになってJWT特有の現象かと思って慌ててた。rest_frameworkの範囲だった。アホ。)