0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

djangoで、事前にログイン・ユーザー認証をしていないと使用できないRESTAPIを作成する。

Last updated at Posted at 2023-08-01

結論

djangorestframeworkを使用して、セッション認証を通すように実装します。そうすることで、事前にブラウザ上でログインをしていないと使用できないRESTAPIを作成できます。

前提

  • djangoでWebアプリを既に作成している。何かしらの方法でログイン・ユーザー認証を実装できている状態であるとします。
  • 使用モジュールの各バージョンは以下です
    • Django 3.2.20

作成手順

  1. pipで下記のモジュールをインストールします。
    pip install djangorestframework
    pip install markdown       
    pip install django-filter
    
  2. settings.pyに下記のコードを追加します。
    settings.py
    # ...
    INSTALLED_APPS = [
        # ...
        'rest_framework', # 追加
        # ...
    ]
    # ...
    # 追加
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework.authentication.SessionAuthentication',
        ]
    }
    
  3. 下記に則ったコードでRESTAPIの処理となるViewを作成します。
    views.py
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.permissions import IsAuthenticated
    
    class AuthTestView(APIView):
    
        permission_classes = [IsAuthenticated]
    
        def get(self, request, format=None):
            return Response({"message": "OK"})
    
  4. urlsに作成したViewをルーティングします。

これで、ルーティングしたURLにアクセスすると、ログイン・ユーザー認証できていないと使用できないことが確認できます。

  • ログイン・ユーザー認証済み
    image.png
  • 未ログイン・未ユーザー認証
    image.png

補足

  • settings.pyで、DEFAULT_AUTHENTICATION_CLASSESを設定しました。これはプロジェクトを通してRESTAPIはセッション認証を通すという設定です。もし各Viewで設定したい場合は下記のようにauthentication_classesをView上で設定すればOKです。
views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import SessionAuthentication # 追加
from rest_framework.permissions import IsAuthenticated

class AuthTestView(APIView):
    
    authentication_classes = [SessionAuthentication] # 追加
    permission_classes = [IsAuthenticated]

    def get(self, request, format=None):
        return Response({"message": "OK"})
  • Viewを作成するときに、今回はAPIViewを継承しています。これは他にも継承できるものがあり、それぞれの機能によって役立つものがあるようです。詳しくは下記の記事が参考になります。

  • POSTメソッドを作成する場合、設定によってはクライアント側がcsrftokenを持たせて通信しないと認証失敗となります。この場合はクライアント側にcsrftokenを持たせて通信をするようにしてください。

以上です。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?