Trong bài này, chúng ta sẽ thực hành viết ứng dụng tạo JWT (JSON Web Token) và xác thực người dùng được quyền truy cập API trong DRF (Django Rest Framework). Ta sẽ sử dụng lại code trong bài Tạo REST API với Django REST framework (đổi tên project thành JWTExample) và sử dụng Simple JWT để tạo token xác thực người dùng.

Trước hết, ta tiến hành cài đặt Simple JWT sử dụng câu lệnh sau

Tiếp theo ta vào file settings.py để cấu hình JWT bằng cách thêm đoạn code sau (xem thêm các thông số cấu hình tại đây https://django-rest-framework-simplejwt.readthedocs.io/en/latest/settings.html):

Tiếp theo ta cấu hình url cho việc tạo mới và refresh token trong file urls của project như sau:

Ta kiểm tra việc tạo JWT bằng cách khởi chạy project với lệnh python manage.py runserver. Sau đó sử dụng Postman để tạo post request tới địa chỉ http://127.0.0.1:8000/get-token/ với username và password được tạo ra từ lệnh python manage.py createsuperuser, ta được kết quả sau:

Ở đây, Simple JWT tạo ra hai token là access token (token dùng để xác thực người dùng) và refresh token (tokeen để lấy access token mới khi access token cũ đã hết thời gian sử dụng). Thời hạn sử dụng của các token này được cấu hình bởi tham số ‘ACCESS_TOKEN_LIFETIME’ và ‘REFRESH_TOKEN_LIFETIME’ ta đã thêm vào file settings.py ở trên (trong ví dụ này, access token là 15 phút và refresh token là một ngày)

Để kiểm tra nội dụng của token ta vào trang https://jwt.io/#debugger-io và copy các token trên, ta được kết quả decode như sau:

Để cấp mới access token với refresh token, ta thực hiện POST request tới địa chỉ http://127.0.0.1:8000/refresh-token/ với giá trị refresh là refresh token nhận được ở trên.

Tiếp theo ta cấu hình quyền truy cập đối với getStockInfo() API sử dụng permission_classes decorator như sau (tham khảo thêm về Django Authentication tại đây https://www.django-rest-framework.org/api-guide/authentication/ ):

Sử dụng Chrome truy cập địa chỉ http://127.0.0.1:8000/stockApp/getInfo/ ta nhận được kết quả yêu cầu cần cung cấp token để truy cập API như sau:

Sử dụng Postman và cấu hình access token đã nhận được ở trên trong phần Header của Get Request ta nhận được kết quả trả về là thông tin mã chứng khoán có trong database.

Như vậy chúng ta đã hoàn thành việc sử dụng Simple JWT để tạo access token và xác thực quyền truy cập của người dùng đối với một RestAPI. Tuy nhiên, trong nhiều trường hợp chúng ta cần thêm một số trường thông tin vào access token như thêm role của người dùng, email, name,…Khi đó ta cần phải thay đổi TokenObtainPairView bằng cách viết MyTokenObtainPairView dựa trên TokenObtainPairView như sau (file StockApp/views):

MyTokenObtainPairSerializer là Serializer dựa trên TokenObtainPairSerializer được viết trong file StockApp/serializers.py như sau:

Lưu ý: Mặc định, User Model của Django không có trường Role, do đó để thêm trường thông tin này, ta tạo thêm UserProfile model sử dụng hàm OneToOneField và thêm trường role như sau:

Truy cập vào http://127.0.0.1:8000/admin/StockApp/userprofile/ và cấu hình role cho tài khoản admin của chúng ta là Admin. Sau đó, sử dụng Postman tạo post request tới địa chỉ http://127.0.0.1:8000/get-token/ để tạo mới một token. Ta được kết quả sau:

Kiểm tra lại nội dụng của token với trang https://jwt.io/#debugger-io, ta thấy giá trị role=”Admin” đã được thêm vào trong token:

Như vậy, chúng ta đã hoàn thành việc viết một ứng dụng sử dụng Simple JWT tạo access token và xác thực quyền truy cập của người dùng đối với một RestAPI mà ứng dụng cung cấp. Các bạn có thể tham khảo code của bài này trong trang Github của Itech Seeker tại đây.

Tháng Tám 29, 2021
ITechSeeker