django 微信网页授权登陆实战
? Author: 廖长江
? Link: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
⏱ Publish Date: Jul 29, 2019
? Tag: 微信开发
一、准备工作
0x00 开发前准备
服务号!!!
微信认证。
备案过的域名。
服务器。
0x01 手动触发dns更新
0x02 配置业务域名
0x03 将服务器请求转发到本地
修改服务器的 /etc/ssh/sshd_config
加入 GatewayPorts yes
ssh -R 0.0.0.0:80:localhost:8080 user@server_host
二、微信网页授权
0x01 授权流程
用户同意授权,获取
code
想办法让用户页面跳转到微信的授权链接(比如在修饰器中进行跳转):
def get_wx_authorize_url(appid : str, state: str = None):if state is None:state = "".join([random.choice(string.ascii_letters + string.digits) for _ in range(20)])redirect_url = 'your callback url' # 回调链接,在这里面进行用户信息入库的操作response_type = 'code'scope = 'snsapi_userinfo'wx_url = f"https://open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={redirect_url}&response_type={response_type}&scope={scope}&state={state}#wechat_redirect"return wx_url
通过
code
换取access_token
和openid
def request_access_token(appid : str, secret : str, code: str):secret = settings.WX_SECRETapi = f"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code"r = requests.get(api)return r.json()
通过
access_token
换取 用户信息
def request_userinfo(access_token: str, openid: str):api = f"https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={openid}&lang=zh_CN"r = requests.get(api)return r.json()
用户信息入库
需要注意的是:微信返回的数据编码格式为 ISO-8859-1
,需要转换成 utf-8
。
def convert_string_encoding(s: str, from_encoding: str, to_encoding: str) -> str:"""先根据 from_encoding 转换成bytes,然后在 decode 为 to_encoding 的字符串"""return bytes(s, encoding=from_encoding).decode(to_encoding)
nickname = convert_string_encoding(resp['nickname'], 'ISO-8859-1', 'utf-8')
跳转回原来访问的链接
我的实现方式是在数据库保存一条记录,以 state
为 key
。
from app.models import WXUser, RedirectUrl
from utils import get_wx_authorize_url, get_random_string
from django.shortcuts import redirectdef login_required(func):def wrapper(request, *args, **kwargs):openid = request.openidtry:user = WXUser.objects.get(openid=openid)request.wxuser = userexcept WXUser.DoesNotExist:state = get_random_string()redirect_url = get_wx_authorize_url(state=state)# 存储跳转链接try:r = RedirectUrl.objects.get(state=state)except RedirectUrl.DoesNotExist:r = RedirectUrl()r.state = stateorigin_url = request.get_raw_uri()r.url = origin_urlr.save()return redirect(redirect_url)return func(request, *args, **kwargs)return wrapper
然后在我们设置的回调接口(会带上 code
和 state
)里面,就可以通过 state
从数据库里获取原链接。
class RedirectUrl(BaseModel):state = models.TextField(unique=True)url = models.TextField()
0x02 中间件
这个中间件使用 jwt 作为认证手段,为什么不使用 session
,那可以讲另一个故事了,这里不赘述了。
从 HTTP_AUTHORIZATION
(请求头中的 Authorization
字段)或者 key 为jwttoken
的 cookie
中抽取出 jwt token
,从中解析出 openid
,添加到 request
变量中,之后就可以在后续的 views里面通过 request.openid
直接获取 openid
了。
def jwt_decode(token: Union[str, bytes]) -> tuple:""":param token : 可以是 bytes 也可以是 str,如果是 str,会先 encode 转成 bytes:return: 第一个参数为 payload,第二个参数为异常类型"""if isinstance(token, str):token = token.encode()secret = settings.JWT_SECRETtry:return jwt.decode(token, secret, algorithms=["HS256"]), Noneexcept Exception as e:# 统一捕捉异常:# jwt.exceptions.DecodeError# jwt.exceptions.InvalidSignatureError# jwt.exceptions.ExpiredSignatureErrorreturn None, eclass JWTAuthMiddleware(object):"""小程序认证中间件"""def __init__(self, get_response=None):self.get_response = get_responsedef __call__(self, request, *args, **kws):token = self.get_authorization_header(request)payload, error = jwt_decode(token)if not error:openid = payload['openid']request.openid = openidelse:request.openid = Noneresponse = self.get_response(request, *args, **kws)return responsedef get_authorization_header(self, request):"""从 AUTHORIZATION 请求头或者cookie 中获取 jwt codecookie 的 jwt code 的 key 为 jwtcode:param request::return: rawtoken"""auth_header = request.META.get('HTTP_AUTHORIZATION', '')cookie = request.COOKIESrawtoken = Noneif auth_header != "":try:rawtoken = auth_header.split(" ")[1]except IndexError as e:passif 'jwttoken' in cookie:rawtoken = cookie['jwttoken']return rawtoken
欢迎关注个人微信公众号:全栈不存在的 个人博客:lcj.im
django 微信网页授权登陆实战相关推荐
- python实现网页微信登陆_django 微信网页授权登陆的实现
一.准备工作 0x00 开发前准备 服务号!!! 微信认证. 备案过的域名. 服务器. 0x01 手动触发dns更新 0x02 配置业务域名 0x03 将服务器请求转发到本地 修改服务器的 /etc/ ...
- .NET WebAPI 微信网页授权的实现(一)前端篇
写在前面 微信网页授权登陆是微信网页开发的第一步,由于框架限制需要使用.NET WebAPI的前后端分离模式进行开发,所以经过几天的摸索,写了这个简单的微信网页授权的实现Demo,本篇文章为微信公众号 ...
- 微信OAuth2网页授权登陆接口
微信OAuth2网页授权登陆接口,微信OAuth2网页授权登陆接口,在你的网站上放上可以扫码登陆,会不会吸引更多用户去注册,现在你只需要简单的配制一下就可以轻松实现,还不快点拿走,微信扫码登陆接口开发 ...
- php微信登录app接口开发文档,PHP微信OAuth2网页授权登陆接口
微信OAuth2网页授权登陆接口,微信OAuth2网页授权登陆接口,在你的网站上放上可以扫码登陆,会不会吸引更多用户去注册,现在你只需要简单的配制一下就可以轻松实现,还不快点拿走,微信扫码登陆接口开发 ...
- android user-agent iso-8859-1,微信网页授权,错误40163,ios正确,安卓错误?
2018-07-18:一年时间过去了,我又回来填自己挖的坑了!! 2017年7月,我遇到了这个问题,当时在这里提了问,后来又跟踪了两天,也没彻底搞懂,反正时好时坏,,后来自己主要精力放在H5+开发上, ...
- 微信网页授权并获取用户信息
介绍 在很多微信H5应用里,当用户访问第三方应用时就需要进行微信网页授权,并且很多涉及安全的操作我们必须要先获取用户信息才能继续,本文章简单介绍了微信授权流程,并通过申请微信测试账号来模拟网页授权,用 ...
- Springboot + Spring Security多种登录方式:账号用户名登录+微信网页授权登录
一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...
- 后盾php文档,后盾PHP微信网页授权接口技术文档
为什么要学习网页授权接口 如果用户在微信接口通过微信客户端中访问第三方网页,就可以通过网页授权接口来获取用户数据,就是在获取到用户的唯一openid后实现登陆状态 几乎所有的微信站点业务逻辑都需要用户 ...
- 微信公众号H5【微信网页授权快照页】复现情况,以及解决方法(详细,成功,forcePopup,forceSnapShot,is_snapshotuse)
(上班时间写的!!,大哥们看完记得点赞) 1.官方回答(稀碎) 快照页将会默认对用户屏蔽网页授权弹窗,用户在快照页中仅可进行滑动浏览操作,其他交互将被限制,并提示用户 "该网页需获取个人信息 ...
最新文章
- Intent携带额外的数据的方法
- 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)
- php 显示要上传的图片格式,php判断文件上传图片格式的实例详解
- 语音任务关键--噪声未必能听得到
- 【剑指offer-Java版】24二叉搜索树后序遍历序列
- tensorflow tf.data.TextLineDataset()对象 (包含来自一个或多个文本文件的行的“数据集”) 不懂是啥玩意??
- 01背包问题从简单到复杂
- php for嵌套循环_PHP中的for循环怎样嵌套
- 苹果神秘新iPhone首曝光,外形终于无槽点了!
- Mispelling4
- ADS8364 VHDL程序正式版
- linux查看内网命令,nmap命令查看内网信息的几个...-centos6.3中lspci查看硬件信息提...-学习linux cut 命令的用法_169IT.COM...
- 闲聊:Android 平台网络游戏加速器·一(科普文)
- 计算机学报论文字数要求,常见EI学报综述类文章分析
- java - 数据库账号的加密解密
- Android API 中文(13) —— ToggleButton
- 也谈阻塞、非阻塞、同步、异步
- 从Linux角度以及JVM源码,深入NIO的细节
- 大数据+咖啡因| 可口可乐的转型升级探索
- labview 添加自定义Lib
热门文章
- SQL Server ESQL编程 sqc预处理报错
- go语言的魔幻旅程18-bytes包
- OceanBase携手天阳科技推出新一代信用卡核心系统联合解决方案,为信用卡业务稳健增长提供创新活力与数据动力
- @ScedulerLock踩坑
- 2010年考研完全攻略手记
- 网盘系统|基于SpringBoot的网盘系统的设计与实现
- 固态硬盘连接在SATA2、SATA3接口上,使用不同SATA线的速度对比
- tcgames使用有延迟_用tcgames在电脑玩玩刺激战场、全军出击等游戏常见问题解决方案...
- Windows电脑清理Windows.edb文件,释放C盘空间
- qt 如何让窗口置顶