Day23 - 使用Django-allauth整合社群登入

今天的实作内容主要根据网路资源进行。

Django并没有提供官方的社群登入整合模组,在第三方套件上,django-allauth和python social auth是两个最常被使用的套件,这两种套件都支援了50种以上的社群登入,能符合绝大部分使用者的需求。因在网路上比较容易找到前者的教材,故今天将使用django-auth这个套件。

执行流程如下:

  1. 安装套件
  2. 环境设定
  3. 设定OAuth Client ID和Secret
  4. 修改template

安装套件

pip install django-allauth

环境设定

settings.py

INSTALLED_APPS = [
    'django.contrib.sites',
    # 3rd party
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    # social provider
    'allauth.socialaccount.providers.google',
]

  • django.contrib.sites:为allauth官方文件要求安装。

  • 'allauth', 'allauth.account', 'allauth.socialaccount':allauth的核心模组

  • 'allauth.socialaccount.providers.google':依欲使用的社群软件添加provider

# social_app/settings.py
AUTHENTICATION_BACKENDS = (
    "allauth.account.auth_backends.AuthenticationBackend",
)
SITE_ID = 1
ACCOUNT_EMAIL_VERIFICATION = "none"
ACCOUNT_LOGOUT_ON_GET = True
# Redirect to home URL after login (Default redirects to /accounts/profile/)
LOGIN_REDIRECT_URL = '/'
  • SITE_ID = 1:看了几篇教学,并没有很明确的说明SITE_ID的用途,但根据Django官方文件,应该是django.contrib.sites本身须使用。当环境有多个site的时候需要做设定,SITE_ID可以至Database确认:
select * from database.django_site
  • AUTHENTICATION_BACKENDS:背端验证机制,这边使用allauth做身分认证

  • ACCOUNT_EMAIL_VERIFICATION:是否需验证email

  • ACCOUNT_LOGOUT_ON_GET:是否可使用GET Request进行登出 (透过登出按钮送出GET,则可以省略登出页面)

urls.py

urlpatterns += [
    path('accounts/', include('allauth.urls')),
] 

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

加入allauth.urls,昨天练习使用的django.contrib.auth.urls可以先注解掉。

资料库更新

python manage.py makemigrations
python manage.py migrate

设定OAuth Key

申请OAuth Client ID和Secret

想要使用社群登入,须至该社群软件取得client id和secret使用。 (具体流程网路上有很多教学,就不另外说明)

设定

启动网站,登入管理员网站 (http://127.0.0.1:8000/admin/),新增Social Application。
https://ithelp.ithome.com.tw/upload/images/20211005/20141886DUgKI8U5w3.png

https://ithelp.ithome.com.tw/upload/images/20211005/20141886xcf2PZtDEN.png

修改template

base_generic.html

因为现在身份验证已改用allauth套件进行,配合allauth.urls设定,需更新基础样板中左侧sidebar的登入与登出连结。

          {% if user.is_authenticated %}
          <li>User: {{ user.first_name }} {{ user.last_name }}</li>
          <li><a href="{% url 'account_logout' %}">Logout</a></li>
          {% else %}
          <li><a href="{% url 'account_login' %}">Login</a></li>
          {% endif %}

allauth预设样板

完成以上动作後,点了登入或登出,会连结至allauth提供的预设画面。

如有画面客制化需求,可至python安装套件的位置,将allauth底下的整个templates资料夹(Lib\site-packages\allauth\templates) 复制到专案资料夹下,再修改样板即可。

https://ithelp.ithome.com.tw/upload/images/20211005/20141886G3PvAsIjr8.png


<<:  JavaScript 闭包(Closure) 上集

>>:  [Day 20] SQL in / between / like

Day.23 「更加认识 DOM,并初次了解事件绑定」 —— JavaScript DOM

我们之前在 HTML 篇章有介绍 DOM,是 Document Object Model 的缩写!...

Day04 关於分散式系统的一些概念 (一)

今天开始要讲分散式系统的一些概念罗。 影片在此: Day04_关於分散式系统的一些概念 (一) ...

(Day26) 使用 fetch 串接 Ajax

前言 fetch 是 JavaScript ES6 新增的用来执行 Ajax 行为的方法,相比旧版的...

鬼故事 - 这不是後门这是工程模式!

鬼故事 - 这不是後门这是工程模式! Credit: sandserif 故事开始 故事回到小弯的公...

[Day 30] PHP array_filter

假设目前有阵列 $fruits = [ ['id'=>0,'fruit'=>'apple...