参考了下别人说的原理,根据自己的逻辑实现,没有完全按照别人的原理来,所以不一定适用于大家,仅供参考吧!!!

流程如下:

  1. web发起websocket链接,后端接受链接后立马发送第一次消息,为全局唯一标识key
  2. web收到第一次的消息,将字符串生成二维码展现出来
  3. App进行扫码获取key,并当做参数调用后端接口,成功则App提示用户

  3. 后端收到App的请求,成功处理(APP扫码成功)则向web发送第二次消息,为身份标识token,并关闭连接

  4. web收到token,存到本地,再做登录成功的逻辑,就o了

Django实现websocket的包目前只了解到channels跟dwebsocket,channels维护得比较好,功能也强大一些,所以采用channels了

具体在与web的通讯中,怎么判断App是否扫码了,我是这样做的(仅供参考):

  在后端生成key并第一次向web发送消息的时候,就存入将key存入redis,值为空。然后循环检测该值是否不为空,不为空就当做token发送给web,超时就提醒web。app扫码后调用后端接口时,后端就根据key将值设为身份token,前面循环检测到不为空,就...

当然,可以去掉循环检测,让app也走websocket,把整体当做一个聊天室,可能更好一点。但是由于某些原因,还是算了嘛

下面展示主要代码

跟Web通讯的代码:

from channels.generic.websocket import WebsocketConsumer
import time,random redis_helper = RedisHelper() # 自己的连接Redis工具类 # 扫码登录
class SaoLoginSync(WebsocketConsumer):
redis_hash_name = 'sao_login' # key存入redis1的hash结构名
def connect(self):
# 创建连接时调用
self.accept()
self.key = str(time.time()) + str(random.randint(0,9999)) # 用户id + 时间戳 + 随机数
redis_helper.hset(self.redis_hash_name, self.key, '')
self.send(text_data=self.key) # key发给web生成二维码 # 在此循环监听 app是否扫码了,扫码后吧生成的token发给web
token = False
start_time = time.time()
while not token:
token = redis_helper.hget(self.redis_hash_name, self.key)
if token:
self.send(text_data=token, close=True)
if time.time() - start_time > 120:
self.send(text_data='again', close=True) def disconnect(self, close_code):
# 连接关闭时调用
redis_helper.hdel(self.redis_hash_name, self.key) # 删除key
self.close()

App扫码之后调用的接口代码:

from rest_framework.decorators import api_view

# 扫码完成通知
@api_view(['POST'])
@login_verify # 自己的登录验证装饰器,验证成功会加入user对象参数
def sao_code(request,user):
key = request.POST.get('key') # 扫码获取的key
redis_hash_name = 'sao_login' # key所在的hash结构名,与web通讯时一致
platform = 'web' # 平台
redis_helper = RedisHelper() if redis_helper.hexists(redis_hash_name, key): # 如果key存在
# redis存token
token = create_login_token(user.id, Platform[platform])
login_key = Platform[platform] + '_login_token_' + str(user.id)
redis_helper.set(login_key, token, ex=datetime.timedelta(days=30)) # 记录web的登录token
redis_helper.hset(redis_hash_name, key, token) # app 已经扫码完成,可以把token发送给web
code, msg = (100, 'Sao successfully')
else:
code, msg = (-1, 'Key does not exist') return ret_CORS(code, msg)

对了, 正式部署到服务器的时候,channels得用daphne启动,然后最好配置一下由nginx转发请求

Channels实现扫码登录的更多相关文章

  1. Web应用多账号系统设计及微信扫码登录实现

    Web应用多账号系统设计及微信扫码登录实现 1   前言概述 公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结果及报表. 此MIS系统特点如下: 仅内 ...

  2. C#开发微信门户及应用(45)--微信扫码登录

    在前面随笔<C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理>介绍了基于微信开放平台接口实现的微信扫码直接登录的过程.本篇介绍对扫码登录的一些改进和处理,以便更方便应用在实 ...

  3. C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理

    在现今很多网站里面,都使用了微信开放平台的扫码登录认证处理,这样做相当于把身份认证交给较为权威的第三方进行认证,在应用网站里面可以不需要存储用户的密码了.本篇介绍如何基于微信开放平台的扫码进行网站的登 ...

  4. 微信开放平台开发——网页微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  5. 微信小程序使用场景延伸:扫码登录、扫码支付

    微信小程序使用场景延伸:扫码登录.扫码支付 小程序最适合的使用场景有哪些?相比大家能列举出来很多,但这个场景,大家可能多数没想到_^ 笔者团队近期接到了一个PC项目:转转游戏租号PC官网,该项目要求在 ...

  6. 初涉扫码登录:edusoho实现客户端扫码登录(简版)

    一.项目简介及需求 edusoho是一套商业版的在线教育平台,项目本身基于symfony2框架开发,现在有一款自己的APP,要求在不多修改edusoho自身代码的基础上,实现客户端对PC端扫码登录.不 ...

  7. spring boot高性能实现二维码扫码登录(上)——单服务器版

    前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...

  8. spring boot高性能实现二维码扫码登录(中)——Redis版

    前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...

  9. spring boot高性能实现二维码扫码登录(下)——订阅与发布机制版

     前言 基于之前两篇(<spring boot高性能实现二维码扫码登录(上)——单服务器版>和<spring boot高性能实现二维码扫码登录(中)——Redis版>)的基础, ...

随机推荐

  1. 对spring框架的理解

    spring框架的两大核心理念就是IOC和AOP,在面试的时候经常会被问到你对spring的理解.下面大致的说一下我对spring的理解. 一.IoC 1.1.什么是IoC 众所周知,IoC就是控制反 ...

  2. buildroot管理uboot+kernel+rootfs

    鉴于自己制作根文件系统太麻烦了,所以想用buildroot管理uboot,kernel,另外还可以自动生产rootfs,于是花了两天研究了下buildroot的框架和使用,在自己的2440开发板上也跑 ...

  3. Django Admin初识

    一.网站后台的作用 网站后台通常是相对于动态网站而言,即网站建设是基于数据库驱动的网站.网站后台,有时也称为网站管理后台,是指用于管理网站前台的一些列操作,如:产品.企业 信息的增加.更新.删除等.通 ...

  4. 使用C#的aforge类库识别验证码实例

    一: 验证码处理 1.  一般处理原则 这种验证码为什么说跟没有一样,第一点:字体规范工整,第二点:不旋转扭曲粘连,第三点:字体颜色单一,下面看处理步骤. 这里要注意的是,aforge只接受像素格式为 ...

  5. java web(二): servlet的简单使用和介绍

    前言:通过编写一个servlet类,向浏览器发送hello world来阐述servlet. 一:创建动态web项目 1. 首先切换到javaEE视图. 在ecplise左边即项目管理器哪里右键点击新 ...

  6. 50款经典电影效果LR预设

    Film Looks LR Presets是一套非常专业的经典电影效果LR预设,包含50个不同效果的Lightroom预设,由专业摄影师和Lightroom专家开发,此套LR预设模拟摄影时代的经典电影 ...

  7. Podman and Buildah for Docker users

    转自:https://developers.redhat.com/blog/2019/02/21/podman-and-buildah-for-docker-users/ I was asked re ...

  8. nginx ssl 配置

    user www www; worker_processes auto; error_log /home/wwwlogs/nginx_error.log crit; pid /usr/local/ng ...

  9. Python(五) —— 内置模块

    文档参考:https://docs.python.org/zh-cn/3.7/library/index.html 随机模块——random 这里我们介绍几种常用 random 的操作   名称 功能 ...

  10. zabbix批量添加被监控windows客户端

    由于公司大部分用的是windows服务器,大概有50多台.如果是一台一台添加的话很是麻烦,如果数量更多的话那工作量可想而知.所以网络管理员通常都是非常懒的. 环境:公司虽是域环境,但是除了几台域服务器 ...