django 中 Oauth2 實現第三方登陸
python網站第三方登錄,social-auth-app-django模塊,
social-auth-app-django模塊是專門用於Django的第三方登錄OAuth2協議模塊
目前流行的第三方登錄都采用了OAuth2協議
安裝:
pip install social-auth-app-django
setting 配置:
添加應用,
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'verify.apps.VerifyConfig', 'users.apps.UsersConfig', 'rest_framework', 'corsheaders', 'social_django', ]
2,輸入命令migrate來生成第三方登錄需要的表
注:如無法遷移 可更改 mysql引擎配置
python manage.py migrate
注意新生成的這五張表!!!
3.配置需要的第三方登錄模塊,settings.py
先找到這個包的位置。
繼續配置
# 身份驗證后端 AUTHENTICATION_BACKENDS = [ 'users.utils.UsernameMobileAuthBackend', 'social_core.backends.weibo.WeiboOAuth2', #微博 'social_core.backends.qq.QQOAuth2', #qq 'social_core.backends.weixin.WeixinOAuth2',#微信 'django.contrib.auth.backends.ModelBackend' #指定django的modelbackend 類 ]
配置url
urlpatterns = [ path('admin/', admin.site.urls), #用戶認證 url(r'^',include('verify.urls')), #用戶信息注冊登錄 url(r'^',include('users.urls')), #第三方登錄 url('', include('social_django.urls')) ]
配置這里,當用戶登錄的時候,如果用戶不存在,會自動在用戶表創建用戶,並且關聯用戶信息
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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_django.context_processors.backends', 'social_django.context_processors.login_redirect' , ], }, }, ]
使用第三方參數配置:
# 配置微博開放平台授權(使用其它平台注意更改關鍵字)
SOCIAL_AUTH_WEIBO_KEY = '' SOCIAL_AUTH_WEIBO_SECRET = '' # 登錄成功后跳轉頁面 SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/index/'
第三方平台中需要配置回調url
# social_django.urls 源碼中 urlpatterns = [ # authentication / association # <backend>是一個變量接收要使用登錄模塊的名稱小寫 # 請求URL url(r'^login/(?P<backend>[^/]+){0}$'.format(extra), views.auth, name='begin'), # 回調URL url(r'^complete/(?P<backend>[^/]+){0}$'.format(extra), views.complete, name='complete'), # disconnection url(r'^disconnect/(?P<backend>[^/]+){0}$'.format(extra), views.disconnect, name='disconnect'), url(r'^disconnect/(?P<backend>[^/]+)/(?P<association_id>\d+){0}$' .format(extra), views.disconnect, name='disconnect_individual'), ]
請求URL構造為:http://域名或者ip/login/使用模塊名稱小寫/
如:http://127.0.0.1:8000/login/weibo/
回調URL構造為:http://域名或者ip/complete/使用模塊名稱小寫/
如:http://127.0.0.1:8000/complete/weibo/
回調URL一般需要設置到開放平台的后台
前台頁面可以調用,請求url
最后 登錄測試 查看下表中是否增加 用戶數據。
social_auth_usersocialauth 數據表
登錄成功跳到首頁,發現還處於未登錄狀態,我們需要對源碼做修改
social_core/actions.py
原始代碼 大約第100行左右 更改
return backend.strategy.redirect(url)
修改為
修改源碼適配drf
from rest_framework_jwt.serializers import jwt_encode_handler,jwt_payload_handler
response = backend.strategy.redirect(url)
payload = jwt_payload_handler(user)
response.set_cookie('username',user.username,max_age=24*3600)
response.set_cookie('user_id',user.id,max_age=24*3600)
response.set_cookie('token',jwt_encode_handler(payload),max_age=24*3600)
return response
現在就登錄后就正常了。qq和微信的登錄,一樣的操作,只要去開放平台注冊應用,其它跟微博登錄一樣設置就可以了。