好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Django使用Social-Auth实现微信第三方网站扫码登录的方法介绍

前言

之前让网页公司制作新官网的时候规划有 第三方账号 的登录功能,但由于当时的一些开放平台申请步骤比较繁琐(尤其是微信开放平台),所以一直拖延着,到了最近只能自己添加相关的功能。

由于是刚接触 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测试数据

认证通过后,添加相应的网页应用,注意 授权回调域 的填写,写网站的主域名即可,比如说不能写 HdhCmsTestzzmxy测试数据/login/wechat 之类的,只需要写 HdhCmsTestzzmxy测试数据 即可(不需要添加http或者https),不然后期都是 redirect_uri 参数错误 !

实操步骤

安装 social-auth :
由于官网使用的是 python-social-auth==0.2.12 ,下载源码回来之后,发现在 social-backends 里也是有 Weixin.py 的,证明可用;

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 

配置完之后,运行你的网站,使用 HdhCmsTest域名测试数据/login/weixin 访问即可打开相应的页面了,但有没有发现出现错误了: Scope参数错误或没有Scope权限 ,实际操作过程中,我发现 social-auth 自动生成的二维码访问链接里,是少了一个 scope 参数,而微信官方给的二维码访问链接是这样的:

https://open.weixin.qq测试数据/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 

修改保存后,再重新运行工程,再次访问 HdhCmsTest域名测试数据/login/weixin 即可看到效果了!

以上就是Django使用Social-Auth实现微信第三方网站扫码登录的方法介绍的详细内容,更多请关注Gxl网其它相关文章!

查看更多关于Django使用Social-Auth实现微信第三方网站扫码登录的方法介绍的详细内容...

  阅读:42次