年薪20萬Python工程師進(jìn)階(1):Django-第三方登錄框架

第三方登陸

1.安裝

pip install social-auth-app-django

2.配置

INSTALLED_APPS=(

...

'social_django',

...

)

3.數(shù)據(jù)生成,直接migrate,因?yàn)樵创a中的 makemigrtasion 生成的數(shù)據(jù)庫(kù)遷移文件已經(jīng)存在了。會(huì)生成5張socia表,不用管

./manage.pymigrate

4.配置中添加

下面是源碼,google的第三方驗(yàn)證,不需要添加。

AUTHENTICATION_BACKENDS=(

'social_core.backends.open_id.OpenIdAuth',

'social_core.backends.google.GoogleOpenId',

'social_core.backends.google.GoogleOAuth2',

'social_core.backends.google.GoogleOAuth',

'social_core.backends.twitter.TwitterOAuth',

'social_core.backends.yahoo.YahooOpenId',

...

'django.contrib.auth.backends.ModelBackend',

)

這里是基于微博,QQ,微信的第三方驗(yàn)證

AUTHENTICATION_BACKENDS = (

? ? #自定義設(shè)置jwt驗(yàn)證登錄時(shí)候,可以匹配手機(jī)和密碼(jwt認(rèn)證接口默認(rèn)匹配密碼和賬戶)

? ? 'users.views.CustomBackend',

? ? #第三方認(rèn)證登錄配置,微博、微信、QQ

? ? 'social_core.backends.weibo.WeiboOAuth2',

? ? 'social_core.backends.qq.QQOAuth2',

? ? 'social_core.backends.weixin.WeixinOAuth',

? ? 'django.contrib.auth.backends.ModelBackend',

)

5.在urls.py中配置URL

urlpatterns = patterns(' ',

...

url(' ',include('social_django.urls', namespace='social'))

...

)

6.setting.py中配置

7.基礎(chǔ)配置完后需要在setting.py中設(shè)置appkey和回調(diào)網(wǎng)站

源碼:

SOCIAL_AUTH_TWITTER_KEY='foobar'

SOCIAL_AUTH_TWITTER_SECRET='bazqux'

我的配置:

#第三方登錄設(shè)置appkey和secret,根據(jù)開發(fā)平臺(tái)的不同而不同

SOCIAL_AUTH_WEIBO_KEY = '23xxxxxxx'? #微博

SOCIAL_AUTH_TWITTER_SECRET = '2c60B652xxxxcxxxxxxxxx'? #微博

SOCIAL_AUTH_QQ_KEY = 'foobar'? #QQ

SOCIAL_AUTH_QQ_SECRET = 'bazqux'? #QQ

SOCIAL_AUTH_WEIXIN_KEY = 'foobar'? #微信

SOCIAL_AUTH_WEIXIN_SECRET = 'bazqux'? #微信

8.成功登陸后跳轉(zhuǎn)頁(yè)面設(shè)置

#第三方登錄成功后跳轉(zhuǎn)頁(yè)面,這里跳轉(zhuǎn)的主頁(yè)

SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/index/'

最后:

? ? 登錄跳轉(zhuǎn)后,會(huì)自動(dòng)生成一個(gè)用戶,和該第三方用戶綁定。

? ? 由于項(xiàng)目的不同,不會(huì)直接登錄,因?yàn)榈谌娇蚣苁菍?shù)據(jù)存在了session中,而我的項(xiàng)目是用JWT機(jī)制保存token來實(shí)現(xiàn)登錄,所以后續(xù)需要修改源碼的方法。

1.拷貝源碼文件夾(social_core)到extra_apps

2.修改extra_apps/actions.py/def do_complete函數(shù)

先導(dǎo)入庫(kù)

from rest_framework_jwt.serializers import jwt_encode_handler, jwt_payload_handler

然后修改def do_complete函數(shù)

###############? ? 修改了這個(gè)? #############

# return backend.strategy.redirect(url)

response = backend.strategy.redirect(url)

#根據(jù)username生成token

payload = jwt_payload_handler(user)

response.set_cookie('name',user.name if user.name else user.username,max_age=24 * 60 * 60)? #一定要設(shè)置過期時(shí)間

response.set_cookie('token',jwt_encode_handler(payload))

return response


最后完成第三方用戶登錄


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容