Channels实现扫码登录
参考了下别人说的原理,根据自己的逻辑实现,没有完全按照别人的原理来,所以不一定适用于大家,仅供参考吧!!!
流程如下:
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实现扫码登录的更多相关文章
- Web应用多账号系统设计及微信扫码登录实现
Web应用多账号系统设计及微信扫码登录实现 1 前言概述 公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结果及报表. 此MIS系统特点如下: 仅内 ...
- C#开发微信门户及应用(45)--微信扫码登录
在前面随笔<C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理>介绍了基于微信开放平台接口实现的微信扫码直接登录的过程.本篇介绍对扫码登录的一些改进和处理,以便更方便应用在实 ...
- C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理
在现今很多网站里面,都使用了微信开放平台的扫码登录认证处理,这样做相当于把身份认证交给较为权威的第三方进行认证,在应用网站里面可以不需要存储用户的密码了.本篇介绍如何基于微信开放平台的扫码进行网站的登 ...
- 微信开放平台开发——网页微信扫码登录(OAuth2.0)
1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...
- 微信小程序使用场景延伸:扫码登录、扫码支付
微信小程序使用场景延伸:扫码登录.扫码支付 小程序最适合的使用场景有哪些?相比大家能列举出来很多,但这个场景,大家可能多数没想到_^ 笔者团队近期接到了一个PC项目:转转游戏租号PC官网,该项目要求在 ...
- 初涉扫码登录:edusoho实现客户端扫码登录(简版)
一.项目简介及需求 edusoho是一套商业版的在线教育平台,项目本身基于symfony2框架开发,现在有一款自己的APP,要求在不多修改edusoho自身代码的基础上,实现客户端对PC端扫码登录.不 ...
- spring boot高性能实现二维码扫码登录(上)——单服务器版
前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...
- spring boot高性能实现二维码扫码登录(中)——Redis版
前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...
- spring boot高性能实现二维码扫码登录(下)——订阅与发布机制版
前言 基于之前两篇(<spring boot高性能实现二维码扫码登录(上)——单服务器版>和<spring boot高性能实现二维码扫码登录(中)——Redis版>)的基础, ...
随机推荐
- 汇编实验1(又是作业emm)
实验任务:学会使用debug 1.使用Debug,将程序段写入内存: 机器码: b8 20 4e 05 16 14 bb 00 20 01 d8 89 c3 01 d8 b8 1a 00 bb 26 ...
- POJ1037 A decorative fence
题意 Language:Default A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 84 ...
- 自己实现一个jQuery插件
<script src="https://cdn.staticfile.org/jquery/2.0.3/jquery.min.js"></script> ...
- Just nothing
I know that's I should do what I can to find a job But I can't focus on it I am always sad and I can ...
- Linux 定时任务Crontab的使用
1.准备好Java程序,导出为Jar文件 如myProject.jar 2.写Shell脚本 startTask.sh echo 'start...' cd /home/root/yourFolde ...
- Django 00-socket、wsgi及初始django学习心得
HTTP基本原理1.http简述:http协议永远都是客户端发起请求,服务端回送请求.客户端和服务端本质上是一个socket客户端和服务端,http协议可以说是基于socket的再上层封装2.http ...
- zabbix批量添加被监控windows客户端
由于公司大部分用的是windows服务器,大概有50多台.如果是一台一台添加的话很是麻烦,如果数量更多的话那工作量可想而知.所以网络管理员通常都是非常懒的. 环境:公司虽是域环境,但是除了几台域服务器 ...
- 一个极其简易版的vue.js实现
前言 之前项目中一直在用vue,也边做边学摸滚打爬了近一年.对一些基础原理性的东西有过了解,但是不深入,例如面试经常问的vue的响应式原理,可能大多数人都能答出来Object.defineProper ...
- [ZZ] 多领域视觉数据的转换、关联与自适应学习
哈工大左旺孟教授:多领域视觉数据的转换.关联与自适应学习 http://blog.sciencenet.cn/home.php?mod=space&uid=3291369&do=blo ...
- Tornado异步非阻塞的使用以及原理
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado ...