iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
1
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
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
meowhua
iT邦新手 5 級 ‧ 2023-03-07 16:16:23

大大您好,
想請問設定完以後要透過什麼 url 讓使用者進行登入呢?
我原本的想法是,這個套件取代了 Django 內建的 auth 去做使用者的登入登出等
所以一樣可以使用

urlpatterns = [
    ...
    path('accounts/', include('django.contrib.auth.urls')),
    ...
]

讓使用者從 /login 登入,但嘗試以後發現不太對..
想請問您是怎麼實作的呢?

elleryq iT邦新手 4 級 ‧ 2023-03-07 21:12:39 檢舉

這個套件主要是給 django restframework 用的,django 登入的部份要另外找。
你可以參考這篇:https://www.geeksforgeeks.org/django-authentication-project-with-firebase/
我剛看了,這應該是你要的。

meowhua iT邦新手 5 級 ‧ 2023-03-08 00:47:24 檢舉

因為我是打算用 firebase 再轉 Microsoft Azure AD 做驗證,所以變得更複雜了(我有看過 Geeks 的那篇,但他是用帳號密碼)
不過還是謝謝你!我再來研究看看

我要留言

立即登入留言