? 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 授权流程

  1. 用户同意授权,获取 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
  1. 通过 code 换取 access_tokenopenid

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()
  1. 通过 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()
  1. 用户信息入库

需要注意的是:微信返回的数据编码格式为 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')
  1. 跳转回原来访问的链接

我的实现方式是在数据库保存一条记录,以 statekey

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

然后在我们设置的回调接口(会带上 codestate)里面,就可以通过 state 从数据库里获取原链接。

class RedirectUrl(BaseModel):state = models.TextField(unique=True)url = models.TextField()

0x02 中间件

这个中间件使用 jwt 作为认证手段,为什么不使用 session,那可以讲另一个故事了,这里不赘述了。

HTTP_AUTHORIZATION (请求头中的 Authorization 字段)或者  key 为jwttokencookie  中抽取出 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 微信网页授权登陆实战相关推荐

  1. python实现网页微信登陆_django 微信网页授权登陆的实现

    一.准备工作 0x00 开发前准备 服务号!!! 微信认证. 备案过的域名. 服务器. 0x01 手动触发dns更新 0x02 配置业务域名 0x03 将服务器请求转发到本地 修改服务器的 /etc/ ...

  2. .NET WebAPI 微信网页授权的实现(一)前端篇

    写在前面 微信网页授权登陆是微信网页开发的第一步,由于框架限制需要使用.NET WebAPI的前后端分离模式进行开发,所以经过几天的摸索,写了这个简单的微信网页授权的实现Demo,本篇文章为微信公众号 ...

  3. 微信OAuth2网页授权登陆接口

    微信OAuth2网页授权登陆接口,微信OAuth2网页授权登陆接口,在你的网站上放上可以扫码登陆,会不会吸引更多用户去注册,现在你只需要简单的配制一下就可以轻松实现,还不快点拿走,微信扫码登陆接口开发 ...

  4. php微信登录app接口开发文档,PHP微信OAuth2网页授权登陆接口

    微信OAuth2网页授权登陆接口,微信OAuth2网页授权登陆接口,在你的网站上放上可以扫码登陆,会不会吸引更多用户去注册,现在你只需要简单的配制一下就可以轻松实现,还不快点拿走,微信扫码登陆接口开发 ...

  5. android user-agent iso-8859-1,微信网页授权,错误40163,ios正确,安卓错误?

    2018-07-18:一年时间过去了,我又回来填自己挖的坑了!! 2017年7月,我遇到了这个问题,当时在这里提了问,后来又跟踪了两天,也没彻底搞懂,反正时好时坏,,后来自己主要精力放在H5+开发上, ...

  6. 微信网页授权并获取用户信息

    介绍 在很多微信H5应用里,当用户访问第三方应用时就需要进行微信网页授权,并且很多涉及安全的操作我们必须要先获取用户信息才能继续,本文章简单介绍了微信授权流程,并通过申请微信测试账号来模拟网页授权,用 ...

  7. Springboot + Spring Security多种登录方式:账号用户名登录+微信网页授权登录

    一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...

  8. 后盾php文档,后盾PHP微信网页授权接口技术文档

    为什么要学习网页授权接口 如果用户在微信接口通过微信客户端中访问第三方网页,就可以通过网页授权接口来获取用户数据,就是在获取到用户的唯一openid后实现登陆状态 几乎所有的微信站点业务逻辑都需要用户 ...

  9. 微信公众号H5【微信网页授权快照页】复现情况,以及解决方法(详细,成功,forcePopup,forceSnapShot,is_snapshotuse)

    (上班时间写的!!,大哥们看完记得点赞) 1.官方回答(稀碎) 快照页将会默认对用户屏蔽网页授权弹窗,用户在快照页中仅可进行滑动浏览操作,其他交互将被限制,并提示用户 "该网页需获取个人信息 ...

最新文章

  1. Intent携带额外的数据的方法
  2. 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)
  3. php 显示要上传的图片格式,php判断文件上传图片格式的实例详解
  4. 语音任务关键--噪声未必能听得到
  5. 【剑指offer-Java版】24二叉搜索树后序遍历序列
  6. tensorflow tf.data.TextLineDataset()对象 (包含来自一个或多个文本文件的行的“数据集”) 不懂是啥玩意??
  7. 01背包问题从简单到复杂
  8. php for嵌套循环_PHP中的for循环怎样嵌套
  9. 苹果神秘新iPhone首曝光,外形终于无槽点了!
  10. Mispelling4
  11. ADS8364 VHDL程序正式版
  12. linux查看内网命令,nmap命令查看内网信息的几个...-centos6.3中lspci查看硬件信息提...-学习linux cut 命令的用法_169IT.COM...
  13. 闲聊:Android 平台网络游戏加速器·一(科普文)
  14. 计算机学报论文字数要求,常见EI学报综述类文章分析
  15. java - 数据库账号的加密解密
  16. Android API 中文(13) —— ToggleButton
  17. 也谈阻塞、非阻塞、同步、异步
  18. 从Linux角度以及JVM源码,深入NIO的细节
  19. 大数据+咖啡因| 可口可乐的转型升级探索
  20. labview 添加自定义Lib

热门文章

  1. SQL Server ESQL编程 sqc预处理报错
  2. go语言的魔幻旅程18-bytes包
  3. OceanBase携手天阳科技推出新一代信用卡核心系统联合解决方案,为信用卡业务稳健增长提供创新活力与数据动力
  4. @ScedulerLock踩坑
  5. 2010年考研完全攻略手记
  6. 网盘系统|基于SpringBoot的网盘系统的设计与实现
  7. 固态硬盘连接在SATA2、SATA3接口上,使用不同SATA线的速度对比
  8. tcgames使用有延迟_用tcgames在电脑玩玩刺激战场、全军出击等游戏常见问题解决方案...
  9. Windows电脑清理Windows.edb文件,释放C盘空间
  10. qt 如何让窗口置顶