前言
之前讓網頁公司製作新官網的時候規劃有第三方賬號
的登錄功能,但由於當時的一些開放平臺申請步驟比較繁瑣(尤其是微信開放平臺),所以一直拖延着,到了最近只能自己添加相關的功能。
由於是剛接觸Python
和Django
,期間找了好多視頻和資料學習練習,才慢慢把MVT結構
什麼的弄明白了,第三方登錄方面百度找到了兩篇很有用的文章,也從中學習到了很多:
1. python實現微信第三方網站掃碼登錄(Django)
2. 用django-social-auth 做中國社交網站三方登錄(QQ,微博,豆瓣,百度,人人,微信)
在實現QQ、微博的登錄時就深刻體會到使用social-auth
來實現第三方登錄是非常簡單方便、直接而且完美的,只需要添加配置內容,一句代碼都不需要寫,真的是一句處理的代碼都不需要寫哦!
然而卻一直沒有找到微信
怎麼也同樣來實現(上面第二篇文章雖然標題有,但文章內卻壓根沒有提及);從social-auth
的解讀文檔裏也愣是沒找到Weixin的內容,由於官網已經有相應的User
數據表以及存儲第三方的UserSocialAuth
數據格,非常規範,在使用上面第一種方法實現之後卻苦惱於用戶數據表的添加和修改,真心不想破壞那種結構,就在重拾social-auth
想學習一下數據庫存儲方式的時候,竟然在social-backends
裏發現了Weixin.py
,那不就說明能支持微信麼?
注意事項
-
微信開放平臺
申請及開通需要提交很多認證資料,也需要繳納¥300每年的認證費用;與公衆號、服務號等不一樣哦。地址:http://open.weixin.qq.com -
認證通過後,添加相應的網頁應用,注意
授權回調域
的填寫,寫網站的主域名即可,比如說不能寫www.zzmxy.com/login/wechat
之類的,只需要寫www.zzmxy.com
即可(不需要添加http或者https),不然後期都是redirect_uri 參數錯誤
!
實操步驟
-
安裝
social-auth
:
由於官網使用的是python-social-auth==0.2.12
,下載源碼回來之後,發現在social-backends
裏也是有Weixin.py
的,證明可用(Ubuntu + Python2.7 + Django1.7);pip install python-social-auth==0.2.12
-
social-auth
配置:-
SOCIAL_AUTH_PIPELINE
配置:請參考上面提及的第二篇文章的書寫; -
AUTHENTICATION_BACKENDS
配置:-
AUTHENTICATION_BACKENDS = (
-
'social.backends.weibo.WeiboOAuth2', #微博的功能
-
'social.backends.qq.QQOAuth2', #QQ的功能
-
'social.backends.weixin.WeixinOAuth2', #這個是導入微信的功能
-
'oscar.apps.customer.auth_backends.EmailBackend',
-
'django.contrib.auth.backends.ModelBackend',
-
)
-
-
微信開放平臺應用
APPID
與SECRET
的配置:-
SOCIAL_AUTH_WEIBO_KEY = '53*****29'
-
SOCIAL_AUTH_WEIBO_SECRET = '272152************81a8b3'
-
SOCIAL_AUTH_QQ_KEY = '10*****51'
-
SOCIAL_AUTH_QQ_SECRET = '5807************d15bd97'
-
SOCIAL_AUTH_WEIXIN_KEY = 'wx4fb***********599' #開放平臺應用的APPID
-
SOCIAL_AUTH_WEIXIN_SECRET = 'f1c17************08c0489' #開放平臺應用的SECRET
-
-
-
配置完之後,運行你的網站,使用 www.域名.com/login/weixin 訪問即可打開相應的頁面了,但有沒有發現出現錯誤了:
Scope參數錯誤或沒有Scope權限
,實際操作過程中,我發現social-auth
自動生成的二維碼訪問鏈接裏,是少了一個scope
參數,而微信官方給的二維碼訪問鏈接是這樣的:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
如上需要的參數爲5個,
state
可省略,但scope
則是必需的,而對於網頁授權的訪問,scope
作用域參數爲固定值scope=snsapi_login
,這樣的話,我們就需要在social-auth
的源代碼上,把這個參數值給加上,根據你實際的site-packages
安裝路徑,找到/social/backends/weixin.py
文件,如我使用VirtualEnv
建的路徑是:/home/ubuntu/env/mppython/lib/python2.7/site-packages/social/backends/weixin.py
打開這個文件,找到裏面
def auth_params()
這一段內容(原文):-
def auth_params(self, state=None):
-
appid, secret = self.get_key_and_secret()
-
params = {
-
'appid': appid,
-
'redirect_uri': self.get_redirect_uri(state),
-
}
-
if self.STATE_PARAMETER and state:
-
params['state'] = state
-
if self.RESPONSE_TYPE:
-
params['response_type'] = self.RESPONSE_TYPE
-
return params
在
params
字典裏,添加一個scope
參數即可,修改後如下:-
def auth_params(self, state=None):
-
appid, secret = self.get_key_and_secret()
-
params = {
-
'appid': appid,
-
'redirect_uri': self.get_redirect_uri(state),
-
'scope': 'snsapi_login',
-
}
-
if self.STATE_PARAMETER and state:
-
params['state'] = state
-
if self.RESPONSE_TYPE:
-
params['response_type'] = self.RESPONSE_TYPE
-
return params
修改保存後,再重新運行工程,再次訪問 www.域名.com/login/weixin 即可看到效果了!
-
後記
本文的內容是在《用django-social-auth 做中國社交網站三方登錄(QQ,微博,豆瓣,百度,人人,微信)》基礎上擴展的,有些地方並沒有細化或者深入說明(比如說urls
的配置等),如果看不太明白的朋友,請轉到上述文章查找相關的信息或者留言交流,謝謝!