使用Django实现微信公众号用户openid登录认证

最近在用Django做一个小项目,需要将微信的用户与网站的用户进行关联,由于是微信的订阅号,没有oauth网页授权的权限,只能退而求其次,在响应中获取用户的openid,来唯一的标识用户。

Django中用户的模型继承和扩展于AbstractUser,在用户模型中添加openid字段:

models.py

class Users(AbstractUser):
    openid = models.CharField(max_length=100,blank=True,null=True,verbose_name="openid",unique=True)

我们扩展了用户的模型,并使用这个模型来作为用户认证的模型,需要在setting.py文件里指定认证的模型(website是django应用的名称,非项目名称):

AUTH_USER_MODEL = ‘website.Users‘

这样,我们就能够使用上面定义的Users模型来进行用户的登录和注册操作了。

一个常见默认的Django登录认证,使用的是authenticate,在此引用Django文档中的叙述:

认证一个给定用户名和密码,请使用authenticate()

它以关键字参数形式接收凭证,对于默认的配置它是username

和password,如果密码对于给定的用户名有效它将返回一个User对象。

如果密码无效,authenticate()返回None。

例子:

from django.contrib.auth import authenticate
user = authenticate(username=‘john‘, password=‘secret‘)
if user is not None:
    if user.is_active:
        print("User is valid, active and authenticated")
    else: print("The password is valid, but the account has been disabled!")
else: print("The username and password were incorrect.")

如果authenticate返回正确的User对象,我们再使用login()方法,对返回的User对象进行登录:

from django.contrib.auth import login
login(request,user)

这样就完成了一个最基本的Django用户认证。

如果我们要用其他的方式进行登录认证呢,比如电子邮箱、手机号、或是本文所说的重点:微信openid,那就需要自定义认证方式。

在Django中进行自定义认证很是方便,完成一个自定义的认证只需要三步:

1、编写一个认证后端:

一个认证后端是个实现两个方法的类: get_user(user_id)和authenticate(**credentials)

在此,我们新建一个py文件wechatAuth.py来写openid的认证后端:

from .models import Users
‘‘‘
    微信openid认证登录
‘‘‘
class WechatOpenidAuth(object):
    def get_user(self,id_):
        try:
            return Users.objects.get(pk=id_)
        except Users.DoesNotExist:
            return None

    def authenticate(self,openid=None):
        try:
            user = Users.objects.get(openid=openid)
            if user is not None:
                return user
            return None
        except Users.DoesNotExist:
            return None

2、在配置文件setting.py中指定认证后端:

在底层,Django 维护一个“认证后台”的列表。

当调用django.contrib.auth.authenticate() 时,Django 会尝试所有的认证后台进行认证。

如果第一个认证方法失败,Django 将尝试第二个,以此类推,直至试完所有的认证后台。

使用的认证后台通过AUTHENTICATION_BACKENDS 设置指定。

AUTHENTICATION_BACKENDS = (

‘django.contrib.auth.backends.ModelBackend‘,

‘website.wechat_auth.WechatOpenidAuth‘,

)

第一个认证后端是Django默认的认证方式,因为在Web端还需要使用,所以保留,第二个就是基于openid的认证后端。

3、使用自定义的认证后端处理登录授权:

同样的使用authenticate()方法和login()方法,但是我们只传入一个参数进去,就是openid

from django.contrib.auth import login,authenticate
def auth(request,openid):
  try:
        auth =authenticate(openid=openid)
        login(request,auth)
        print("登录成功",auth)
  except Exception as e:
        print(e)

这样,一个基于openid的认证就完成了。

在微信的订阅号中,我们可以利用click事件返回一个文本消息或图文消息,在其链接之中带上openid的参数。这样,当用户点击链接,就可以静默地完成用户的登录了。

=========================================================

原文信息

文章首发:http://zmister.com

原文链接

微信公众号:州的先生 同步更新

原文地址:https://www.cnblogs.com/fzw-/p/8972875.html

时间: 2024-08-04 14:14:24

使用Django实现微信公众号用户openid登录认证的相关文章

asp获取微信公众号用户的头像和微信名及openid源码

asp获取微信公众号用户的头像和微信名及openid源码,asp写的,可以获取用户的头像和微信名,性别及openid等 <script language="jscript" runat="server">function getjson(str){ try{ eval("var jsonStr = (" + str + ")"); }catch(ex){ var jsonStr = null; } return j

微信公众号用户与网站用户的绑定(一)

绑定:对于同一个用户,我们如何建立微信公众号用户(openid)与网站用户(userid)之间的对应关系. 一次完整的绑定流程应该是这样的: ①用户登录网页,点击"绑定微信账户":②后台使用微信接口,生成二维码链接返回给前端显示,并建立场景值A与用户的对应关系:③用户扫描二维码,并点击关注微信公众号(假如已关注,直接跳到④):④后台接收微信服务器推送的场景值A:⑤后台根据场景值A,查询到对应的用户ID(依赖于②中建立的对应关系):⑥建立用户userid与微信用户openid的对应关系:

微信公众号用户与网站用户的绑定方案

现在很多网站都已经建立了一套完整的用户账号体系,基于这套体系,再做其他应用的用户扩展就非常方便.例如,有了微软的outlook账户,就可以登录win8,可以登录微软的邮箱,还可以登录skype.同样地,一个Apple ID可以享受苹果的所有服务.正所谓,一个账号,处处使用.对于企业,可能会有产品线通常有网站,app,微信公众号等.统一各产品线的账号体系,实现一个账号处处使用的目标是非常有必要的.网站和app使用同一个账号,不需要做任何多余的工作,客户只要有用户名密码即可登录.对于微信公众号,由于

微信公众号网页授权登录获取用户基本信息

发布时间:2018-10-24 技术:spring springboot,微信公众号 概述 微信公众号网页授权登录后微信获取用户基本信息,部署即可运行完整demo 详细 代码下载:http://www.demodashi.com/demo/14290.html 一.前言 (1)适合人群 1,JAVA服务端开发人员 2,初级人员开发人员 3,了解spring springboot + maven 3,了解公众号开发 (2)你需要准备什么? 1,积极主动学习 2,微信公众号开发基本流程 3,java

微信公众号用户与网站用户的绑定-登陆公众号时获取openid(二)

如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域名的说明 1.在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名.请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加http://等协议头: 2.授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html . ht

微信公众号用户信息认证机制

又有一段时间没动笔了,确实工作后忙碌起来了,年末了,给大家拜年了,抽了这个空档把最近做的一个东西分享分享. 微信公众号,相信不少人已经有接触,其开发分为许多种,本次主要说的是,通过微信认证后的公众号(下图,),使用Oauth网页接口来获取用户信息的流程. 一.基础准备 首先,明确需求:有一个应用服务器,希望通过某个链接(菜单)进入此应用,在应用服务器端可以获得访问者的一些信息. 微信是不会直接让你在用户在访问应用服务器时直接取到用户信息的,而需要通过他们的专门的认证服务器来操作.作为开发者,目前

微信公众号菜单openid 点击菜单即可打开并登录微站

现在大部分微站都通过用户的微信openid来实现自动登录.在我之前的开发中,用户通过点击一个菜单,公众号返回一个图文,用户点击这个图文才可以自动登录微站.但是如果你拥有高级接口,就可以实现点击菜单,打开网页就能获取这个openid,实现自动登录. 这里已经提到,必须要拥有高级接口的权限(服务号.企业号),开启了开发者模式. 1.设置回调地址 在微信公众平台后台“开发者中心”中找到“高级接口”下的“OAuth2.0网页授权”,后面有一个“修改”,点击之后就会弹出填写回调地址的对话框.具体如何授权,

作业七——“南通大学教务管理系统微信公众号” 用户体验分析

1. 目标 基于实例分析,体会用户体验设计的 7 条准则 2. 要求 基于我们列出的 7 条UX评价准则,分析“南通大学教务管理系统微信公众号” 在用户体验设计方面让你觉得满意的地方(不少于2点):(20分),请陈述理由. 同样,分析“南通大学教务管理系统微信公众号” 在用户体验设计方面让你觉得最不满意的地方(不少于2点):(20分),请陈述理由. 回答上述问题时,附上截图 使用Nielsen的十条准则做WEB的启发式评估 基于以下设计准则去做评估: Visibility of system s

JAVA微信公众号通过openid发送模板消息~

1,问题产生 在微信公众号开发过程中,我们有时候做不同权限的时候,比如在注册的时候,需要审核,然后我们要想办法让对方知道审核的结果.这时候我们可以通过模板消息来通知. 2,第一步,首先在微信公众号上获取模板消息 首先,登录微信公众平台,看有没有模板消息这一块,没有的话点击添加功能插件,去添加,这里就省略不说了,这个主要就是选择你公众号的行业对应的模板消息,然后通过审核之后就可以使用了,说是几个工作日 但是一般很快就审核通过的. 有模板消息之后点进来,对应自己所需要的模板消息进行添加,比如,我添加