Django使用Social-Auth實現微信第三方網站掃碼登陸

前言

以前讓網頁公司製做新官網的時候規劃有第三方帳號的登陸功能,但因爲當時的一些開放平臺申請步驟比較繁瑣(尤爲是微信開放平臺),因此一直拖延着,到了最近只能本身添加相關的功能。html

因爲是剛接觸PythonDjango,期間找了好多視頻和資料學習練習,才慢慢把MVT結構什麼的弄明白了,第三方登陸方面百度找到了兩篇頗有用的文章,也從中學習到了不少:python

1. python實現微信第三方網站掃碼登陸(Django)
2. 用django-social-auth 作中國社交網站三方登陸(QQ,微博,豆瓣,百度,人人,微信)數據庫

在實現QQ、微博的登陸時就深入體會到使用social-auth來實現第三方登陸是很是簡單方便、直接並且完美的,只須要添加配置內容,一句代碼都不須要寫,真的是一句處理的代碼都不須要寫哦!
然而卻一直沒有找到微信怎麼也一樣來實現(上面第二篇文章雖然標題有,但文章內卻壓根沒有說起);從social-auth解讀文檔裏也愣是沒找到Weixin的內容,因爲官網已經有相應的User數據表以及存儲第三方的UserSocialAuth數據格,很是規範,在使用上面第一種方法實現以後卻苦惱於用戶數據表的添加和修改,真心不想破壞那種結構,就在重拾social-auth想學習一下數據庫存儲方式的時候,居然在social-backends裏發現了Weixin.py,那不就說明能支持微信麼?django

注意事項

  • 微信開放平臺申請及開通須要提交不少認證資料,也須要繳納¥300每一年的認證費用;與公衆號、服務號等不同哦。地址:http://open.weixin.qq.comubuntu

  • 認證經過後,添加相應的網頁應用,注意受權回調域的填寫,寫網站的主域名便可,好比說不能寫www.zzmxy.com/login/wechat之類的,只須要寫www.zzmxy.com 便可(不須要添加http或者https),否則後期都是redirect_uri 參數錯誤!segmentfault

實操步驟

  1. 安裝social-auth
    因爲官網使用的是python-social-auth==0.2.12,下載源碼回來以後,發如今social-backends裏也是有Weixin.py的,證實可用(Ubuntu + Python2.7 + Django1.7);api

    pip install python-social-auth==0.2.12
  2. social-auth配置:微信

    • SOCIAL_AUTH_PIPELINE配置:請參考上面說起的第二篇文章的書寫;app

    • AUTHENTICATION_BACKENDS配置:python2.7

      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',
         )
    • 微信開放平臺應用APPIDSECRET的配置:

      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
  3. 配置完以後,運行你的網站,使用 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的配置等),若是看不太明白的朋友,請轉到上述文章查找相關的信息或者留言交流,謝謝!

相關文章
相關標籤/搜索