GitHub 中搜尋:social django app ==>找到: python-social-auth/social-app-django
文檔: https://python-social-auth.readthedocs.io/en/latest/
# 1. 安裝
pip install social-auth-app-django
# django 配置: https://python-social-auth.readthedocs.io/en/latest/configuration/django.html
# 2. 添加到 INSTALLED_APPS
INSTALLED_APPS = (
...
'social_django',
...
)
# 3. 資料庫遷移:第三方登陸的時候,會建立一些額外的資料表
python manage.py migrate # 直接 migrate,不用 makemigrations,因為 migrations檔案已經生成好了
# 4. settings 中配置 AUTHENTICATION_BACKENDS (在源碼中檢視:social_core/backends)
AUTHENTICATION_BACKENDS = (
...
"social_core.backends.weibo.WeiboOAuth2", # 所要添加的第三方登陸;如果還需要其它的第三方登陸,下面可繼續添加
"social_core.backends.qq.QQOAuth2",
"social_core.backends.weixin.WeixinOAuth2",
'django.contrib.auth.backends.ModelBackend',
...
)
# 5. 配置 URL
urlpatterns = patterns('',
...
url('', include('social_django.urls', namespace='social')), # 第三方登陸URL;如果已經有使用者登陸,則會将第三方登陸的使用者和目前使用者綁定,否則第三方登陸後将在你的網站上新建立一個使用者
...
)
# 6. 對于 Django 的 MTV模式,設定 template
<a href="{% url "social:begin" "weibo" %}">微網誌</a> # social:begin social表示名稱空間,begin表示 name="begin"的那個url;
<a href="{% url "social:begin" "google-oauth2" %}">Google+</a>
# 7. 配置 Template Context Processors
TEMPLATES = [
{
...
'OPTIONS': {
...
'context_processors': [
...
'social_django.context_processors.backends',
'social_django.context_processors.login_redirect',
...
]
}
}
]
# 8. 在setting中設定 APP key 和 APP secret
SOCIAL_AUTH_WEIBO_KEY = 'weiboappkey...'
SOCIAL_AUTH_WEIBO_SECRET = 'weiboappsecret...'
# 9. 第三方登陸成功後的跳轉
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/index/'
# 10. 對于前後端分離的項目使用 python-social-auth/social-app-django(GitHub上的搜尋名),需要在第三方包 social_core/actions.py 中的 do_complete() 方法中修改源碼(即第三方認證完成後要把 JWT 和 username 通過set_cookie傳回給前端),如下:
from rest_framework_jwt.serializers import jwt_payload_handler,jwt_encode_handler
def do_complete(backend, login, user=None, redirect_name='next',
*args, **kwargs):
...
response = backend.strategy.redirect(url) # 完成第三方登陸後,所要重定向的URL
# 前後端分離的項目中,需要把 JWT 添加到cookie中傳回給前端
payload = jwt_payload_handler(user)
response.set_cookie("token",jwt_encode_handler(payload),max_age=7*24*3600) # 設定 cookie;一定要加過期時間 max_age
response.set_cookie("name",user.name if user.name else user.username,max_age=7*24*3600)
return response
# 注:微網誌第三方登陸時,授權回調頁的 位址一定要和本機的IP位址保持一緻(如果是在伺服器上,就和伺服器的IP位址保持一緻),如:127.0.0.1:8000/complete/weibo/ 這個回調頁是由微網誌向你的 浏覽器 發送了一個重定向的指令;而支付寶的 notify_url 是 支付寶向你的 伺服器 發送了一個Post請求
轉載于:https://www.cnblogs.com/neozheng/p/9888573.html