iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 16
0
Modern Web

加速你的 Django 網站開發 - Django 的好用套件系列 第 16

16. djangorestframework-firebase

Django 本身就已經有了強大的帳號機制,但是有時會因為專案的考量,API 需要使用其他的帳號驗證服務,例如有名的 Firebase authentication,那麼這個時候,Django REST framework 可不可以使用 Firebase 的帳號系統呢?

答案是可以的,透過 django-rest-framework-firebase 就可以做到,而且變動很少。

專案網址:https://github.com/wesleylima/django-rest-framework-firebase

安裝

poetry add djangorestframework-firebase

設定

要使用 djangorestframework-firebase ,必須先去 firebase console 那邊建立專案,然後進入設定 > 服務帳戶裡取得 admin 的 credential json 或檔案。

接著把它填入 Django 專案的 settings 裡,如果是下載檔案的話,把檔案放到專案可以存取到的地方,然後填入以下設定

# settings

# 如果是取得檔案
FIREBASE_AUTH = {
    'FIREBASE_ACCOUNT_KEY_FILE': 'path_to_your_credentials.json',
}

如果是用 credential json 的話,是這樣填寫:

FIREBASE_AUTH = {
    'FIREBASE_CREDENTIALS': {
        'type': "service_account",
        'project_id': "",
        'private_key_id': "",
        'private_key': "",
        'client_email': "",
        'client_id': "",
        'auth_uri': "https://accounts.google.com/o/oauth2/auth",
        'token_uri': "https://accounts.google.com/o/oauth2/token",
        'auth_provider_x509_cert_url': "https://www.googleapis.com/oauth2/v1/certs",
        'client_x509_cert_url': ""
    }
}

Firebase 的設定填寫完以後,就可以來填寫 REST framework 的設定了。

可以在 REST Framework 的設定裡指定 API 統一使用 FirebaseAuthentication

# settings
REST_FRAMEWORK = {
  ...
  'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework_firebase.authentication.FirebaseAuthentication',
  )
  ...
}

也可以在個別的 APIView 裡面指定。

from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_firebase.authentication import FirebaseAuthentication

class ExampleView(APIView):
    authentication_classes = [FirebaseAuthentication,]  # 就是這裡!
    permission_classes = [IsAuthenticated]

    def get(self, request, format=None):
        content = {
            'username': request.user.username,  # `django.contrib.auth.User` instance.
        }
        return Response(content)

使用

上面設定填寫完以後,在呼叫 API 時,就會使用 Firebase admin SDK 去驗證使用者了。

內部的運作

我們來深入了解一下 django-rest-framework-firebase 內部的運作。

首先,要使用 Firebase SDK 登入,取得 Token。

在呼叫 API 時,把取得的 Token 帶入 Header :

$ curl -H "Authorization: JWT <your_firebase_token>" http://localhost:8000/api/example/

FirebaseAuthentication 類別裡,會先取得 Header 裡的 token,再使用 Firebase Admin SDK 來驗證這個 token。

驗證通過的話,會依據驗證結果裡的 uid / email 去資料庫裡找使用者,有找到的話就傳回使用者。如果沒有找到這個使用者,那麼會再看設定裡的 FIREBASE_CREATE_NEW_USER 變數,為真的時候,就會用 uid / email 來建立使用者。

結語

透過 django-rest-framework-firebase 就可以改用 Firebase 當做主要的帳號驗證服務,真的是很方便。其實我從這個函式庫還學到,如果你的帳號驗證會依賴其他伺服器或服務時,也可以透過這個方式來處理。


上一篇
15. django-url-filter
下一篇
17. django-model-utils
系列文
加速你的 Django 網站開發 - Django 的好用套件30

尚未有邦友留言

立即登入留言