iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
Python

使用 Django 框架和 Wagtail,快速打造一個 CMS 網站系列 第 28

D28 - 驗證來自 request 的 JWT token

  • 分享至 

  • xImage
  •  

昨天,我們在 user 登入的時候,發出了 jwt token,他的格式長得像這樣

{
    "message": "Login successful!",
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzI4MzEwMzY3LCJpYXQiOjE3MjgzMDY3NjcsImp0aSI6IjRkZDY1ZWFkYjg0NTQwY2I5ODdjNDIyNWU5NTJiZjA5IiwidXNlcl9pZCI6Mn0.2xAGjfVLrE0lOBQW8DxQtdwXgCMSV8NZhYlPtmqdqVg",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTcyODM5MzE2NywiaWF0IjoxNzI4MzA2NzY3LCJqdGkiOiIwM2ZjOGFhMGU2YjM0MDIxOGIxMjc1NTgzNDdkNDIwMCIsInVzZXJfaWQiOjJ9.DjGBpe8PJ079fVT-aJ4-JY-wu__nB2DJwKXUch-phc4"
}

雖然我們將這組 token 發給 client ,但我們之前寫的的 hello_world api,是沒有驗證 request 的有效性的。今天的這一篇,我們來加上驗證。

開始在 api/views.py 進行修改,記得 import 對應的 lib,並把 hello_world 改成這樣

from django.contrib.auth import authenticate
from django.http import JsonResponse
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework_simplejwt.tokens import RefreshToken

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def hello_world(request):
    return Response({"message": "Hello, World!"})

現在,試著用 postman 打一下 hello_world,你會得到 401 error,表示沒有權限打這隻 api。

401 是 Unauthorized,你可以在 https://en.wikipedia.org/wiki/List_of_HTTP_status_codes 這邊去查各種 error 代表的意思。

https://ithelp.ithome.com.tw/upload/images/20241009/20140622CaJHLa642y.png

現在,我們將一組從 login 得到的 jwt 放進 header。可以正常呼叫 hello_world

https://ithelp.ithome.com.tw/upload/images/20241009/20140622HReyE4NFzu.png

如果 token 過期,也會得到 401,只是 error message 會不一樣

{
    "detail": "Given token not valid for any token type",
    "code": "token_not_valid",
    "messages": [
        {
            "token_class": "AccessToken",
            "token_type": "access",
            "message": "Token is invalid or expired"
        }
    ]
}

上一篇
D27 - 在 login 成功後,會回傳 JWT token 給 client site
下一篇
D29 - 使用Django admin 後台
系列文
使用 Django 框架和 Wagtail,快速打造一個 CMS 網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言