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的配置等),若是看不太明白的朋友,请转到上述文章查找相关的信息或者留言交流,谢谢!

相关文章
相关标签/搜索