簡單的方法 python-social-auth

python-social-auth 是一個簡化社交認證和授權機制的框架。它包含許多社交後端(Facebook,Twitter,Github,LinkedIn 等)

安裝

首先我們需要安裝 python-social-auth 軟體包

pip install python-social-auth

或者從 github 下載程式碼。現在是將它新增到 requirements.txt 檔案的好時機。

配置 settings.py

在 settings.py 中新增:

INSTALLED_APPS = (
    ...
    'social.apps.django_app.default',
    ...
)

配置後臺

AUTHENTICATION_BACKENDS 包含我們將使用的後端,我們只需要提供我們需要的內容。

AUTHENTICATION_BACKENDS = (
    'social.backends.open_id.OpenIdAuth',
    'social.backends.google.GoogleOpenId',
    'social.backends.google.GoogleOAuth2',
    'social.backends.google.GoogleOAuth',
    'social.backends.twitter.TwitterOAuth',
    'social.backends.yahoo.YahooOpenId',
    ...
    'django.contrib.auth.backends.ModelBackend',
)

你的專案 settings.py 可能還沒有 AUTHENTICATION_BACKENDS 欄位。如果是這種情況,請新增欄位。千萬不要錯過'django.contrib.auth.backends.ModelBackend',,因為它通過使用者名稱/密碼處理登入。

如果我們使用例如 Facebook 和 Linkedin Backends,我們需要新增 API 金鑰

SOCIAL_AUTH_FACEBOOK_KEY = 'YOURFACEBOOKKEY'
SOCIAL_AUTH_FACEBOOK_SECRET = 'YOURFACEBOOKSECRET'

SOCIAL_AUTH_LINKEDIN_KEY = 'YOURLINKEDINKEY'
SOCIAL_AUTH_LINKEDIN_SECRET = 'YOURLINKEDINSECRET'

注意 :你可以獲取在 nedded 鍵的 Facebook 開發者LinkedIn 開發者在這裡你可以看到完整的清單和他各自對 E 指定 API 金鑰及其祕密的方式。

關於金鑰的注意事項: 祕密金鑰應保密。是一個有用的 Stack Overflow 解釋。本教程有助於學習環境變數。

TEMPLATE_CONTEXT_PROCESSORS 將有助於重定向,後端和其他東西,但一開始我們只需要這些:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'social.apps.django_app.context_processors.backends',
    'social.apps.django_app.context_processors.login_redirect',
    ...
)

在 Django 1.8 中,如上所示設定 TEMPLATE_CONTEXT_PREPROCESSORS 已被棄用。如果你是這種情況,你將把它新增到 TEMPLATES dict 中。你應該看一下類似的東西:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'social.apps.django_app.context_processors.backends',
                'social.apps.django_app.context_processors.login_redirect',
            ],
        },
    },
] 

使用自定義使用者

如果你使用自定義使用者模型並希望與其關聯,只需新增以下行(仍在 settings.py 中

SOCIAL_AUTH_USER_MODEL = 'somepackage.models.CustomUser'    

CustomUser 是從預設使用者繼承或摘要的模型。

配置 urls.py

# if you haven't imported inlcude make sure you do so at the top of your file
from django.conf.urls import url, include

urlpatterns = patterns('',
    ...
    url('', include('social.apps.django_app.urls', namespace='social'))
    ...
)

接下來需要同步資料庫以建立所需的模型:

./manage.py migrate

最後我們可以玩!

在某些模板中,你需要新增以下內容:

    <a href="{% url 'social:begin' 'facebook' %}?next={{ request.path }}">Login with Facebook</a>
    <a href="{% url 'social:begin' 'linkedin' %}?next={{ request.path }}">Login with Linkedin</a>

如果你使用另一個後端,只需通過後端名稱更改 facebook

記錄使用者

一旦你登入了使用者,你可能希望建立將其登出的功能。在某些模板中,可能在顯示登入模板的位置附近,新增以下標記:

<a href="{% url 'logout' %}">Logout</a>

要麼

<a href="/logout">Logout</a>

你將要編輯 urls.py 檔案,其程式碼類似於:

url(r'^logout/$', views.logout, name='logout'),

最後編輯 views.py 檔案,其程式碼類似於:

def logout(request):
    auth_logout(request)
    return redirect('/')