【Flask开发】嘿马文学web完整flask项目第2篇:2.用户认证,Json Web Token(JWT)【附代码文档】

教程总体简介:2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目部署uWSGI 配置 启动 9.部署 10.1异常和日志 10.补充 10.2 flask-restful 1.项目目录实现 3.数据库迁移: 1.JWT:json web token 2.jwt工具的封装 4.用户权限校验 5.登录验证装饰器 1.书架列表 2.书架管理 3.最后阅读 2.分类书籍列表 3.热门搜索 7.3小说-详情 2.小说目录 2.阅读偏好 3.阅读设置

完整笔记资料代码:https://gitee.com/yinuo112/Backend/tree/master/Flask/嘿马文学web完整flask项目/note.md

感兴趣的小伙伴可以自取哦~


全套教程部分目录:


部分文件图片:

2.用户认证

  • 平台

  • JWT

  • 用户认证

  • 用户登录

2.1平台

1-1 小程序登录授权

  • 调用 wx.login()获取 临时登录凭证code ,并回传到开发者服务器。
  • 调用 auth.code2Session接口,换取 用户唯一标识 OpenID会话密钥 session_key
  • 小程序授权登录说明:

  • 通过查看官方文档的小程序开发说明,小程序授权登录,需要获取登录凭证校验,通过wx.login(Object) 调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)。

  • 登录凭证code:用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 auth.code2Session,使用 code 换取 openid 和 session_key 等信息。
  • 会话密钥 session_key 是对用户数据进行加密签名的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥
  • 临时登录凭证 code 只能使用一次。
1-2 授权说明
  • 实现授权,获取用户信息。

  • 小程序可以通过官方提供的登录功能来获取用户身份的标识。主要实现的就是通过小程序提供的 code 换取用户的 openid 和 session_key。用到的接口如下:

  • wx.login

    • 调用此接口,以获取登录凭证(code),以用来换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。
    • 如果接口调用成功,返回信息如下:
参数名类型参数说明
errMsgString调用结果
codeString用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key
  • 开发者服务器使用登录凭证 code 获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。

  • wx.getUserInfo

  • 调用此接口,用来获取用户信息。

  • 并用换取到的 openid 和 secret_key 作为自定义的登录状态。具体可以分为如下部分:

  • 提供一个http接口,共小程序使用,传递code;

  • 换取用户身份标识;
  • 维护自定义的登录状态;
  • 存储用户的openid。
1-2-1 开发原理
  1. 小程序通过wx.login API进行登录获取code,根据code获取openid需要在服务端完成,所以需要将code发送给服务端,并且带上授权临时票据code参数;
  2. 服务端通过code和appid、APPSecret获取到openid和SessionKey。
  3. 前端保存自定义登录态,获取用户信息时携带自定义登录态给后端。
1-2-2 服务端
  • 接受小程序前端发送的请求,根据发送过来的code,以及服务端保存的AppId和APPSecret等向服务端发送请求,获取到sessionkey和openid,然后将二者关联起来保存到session存储器中(Redis),返回给前端key值。
  • 接受小程序发送过来的key和用户基本信息,根据key从redis中获取openid,然后对数据库进行查询,若存在数据则封装后返回给前端,若无信息则向数据库中插入数据并返回给前端。
1-2-3 获取session_key(auth.code2Session)
  • 请求地址: [
  • 请求方法:GET
  • 请求参数:
参数名类型是否必须参数说明
appidstringTrue小程序appid
secretstringTrue小程序appSecret
js_codestringTrue登录时获取的code
grant_typestringTrue授权类型,此处只需填写 authorization_code
  • 返回结果:返回的是JSON数据包
属性类型说明
openidstring用户唯一标识
session_keystring会话密钥
unionidstring用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回,
errcodenumber错误码
errmsgstring错误信息
1-2-4 获取用户信息
  • 用户授权登录后,我们可以通过调用平台wx.getUserInfo(Object object)获取用户信息,用来存储用户数据。
1、接口说明
参数名类型是否必须参数说明
withCredentialsbooleanFalse是否带上登录态信息。当 withCredentials 为 true 时,要求此前有调用过 wx.login 且登录态尚未过期,此时返回的数据会包含 encryptedData, iv 等敏感信息;当 withCredentials 为 false 时,不要求有登录态,返回的数据不包含 encryptedData, iv 等敏感信息。
langstringFalse显示用户信息的语言
successfunctionFalse接口调用成功的回调函数
failfunctionFalse接口调用失败的回调函数
completefunctionFalse接口调用结束的回调函数(调用成功、失败都会执行)
2、补充说明
  • encryptedData:包括敏感数据在内的完整用户信息的加密数据。

  • 接口如果涉及敏感数据(如[wx.getUserInfo]( openId 和 unionId),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对称解密。

  • 官方提供了四种编程语言C++、Node、PHP、Python的示例代码,可以自行下载。

  • iv:加密算法的初始向量。

  • 开发者如果遇到因为 session_key 不正确而校验签名失败或解密失败,请关注下面几个与 session_key 有关的注意事项。

  • [wx.login]( 调用时,用户的 session_key 可能会被更新而致使旧 session_key 失效(刷新机制存在最短周期,如果同一个用户短时间内多次调用 [wx.login]( session_key 刷新)。开发者应该在明确需要重新登录时才调用 [wx.login]( [auth.code2Session]( 接口更新服务器存储的 session_key。

  • 不会把 session_key 的有效期告知开发者。我们会根据用户使用小程序的行为对 session_key 进行续期。用户越频繁使用小程序,session_key 有效期越长。
  • 开发者在 session_key 失效时,可以通过重新执行登录流程获取有效的 session_key。使用接口 [wx.checkSession]( session_key 是否有效,从而避免小程序反复执行登录流程。
  • 当开发者在实现自定义登录态时,可以考虑以 session_key 有效期作为自身登录态有效期,也可以实现自定义的时效性策略。
1.3 开发准备
  • 注册账号,选择个人,成为开发者,小程序开发平台:[
  • 实名认证:

  • 提交确认信息:

  • 查看AppID和AppSecret:

  • 获取AppSecret:需要扫码确认。

Json Web Token(JWT)

1-1 JWT简介

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在两个组织之间传递安全可靠的信息。

官方定义:JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties

JWT是一个有着简单的统一表达形式的字符串:

头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 JSON内容要经Base64 编码生成字符串成为Header。

载荷(PayLoad)

payload的五个字段都是由JWT的标准所定义的。

  1. iss: 该JWT的签发者
  2. sub: 该JWT所面向的用户
  3. aud: 接收该JWT的一方
  4. exp(expires): 什么时候过期,这里是一个Unix时间戳
  5. iat(issued at): 在什么时候签发的

后面的信息可以按需补充。 JSON内容要经Base64 编码生成字符串成为PayLoad。

签名(signature)

这个部分header与payload通过header中声明的加密方式,使用密钥secret进行加密,生成签名。 JWS的主要目的是保证了数据在传输过程中不被修改,验证数据的完整性。但由于仅采用Base64对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。

1-2 JWT的Python库

1、独立的JWT Python库

  • itsdangerous

  • JSONWebSignatureSerializer

  • TimedJSONWebSignatureSerializer (可设置有效期)

  • pyjwt

[

2、安装

$ pip install pyjwt

3、使用示例

>>> import jwt>>> encoded_jwt = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
>>> encoded_jwt
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'>>> jwt.decode(encoded_jwt, 'secret', algorithms=['HS256'])
{'some': 'payload'}

4、项目封装

import jwt
from flask import current_appdef generate_jwt(payload, expiry, secret=None):_payload = {'exp': expiry}_payload.update(payload)if not secret:secret = current_app.config['JWT_SECRET']token = jwt.encode(_payload, secret, algorithm='HS256')return token.decode()def verify_jwt(token, secret=None):if not secret:secret = current_app.config['JWT_SECRET']try:payload = jwt.decode(token, secret, algorithm=['HS256'])except jwt.PyJWTError:payload = Nonereturn payload

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[dp5_多状态dp] 按摩师 | 打家劫舍 II | 删除并获得点数 | 粉刷房子

目录 1.面试题 17.16. 按摩师 题解 2.打家劫舍 II 题解 3.删除并获得点数 题解 4.粉刷房子 题解 一定要有这样的能力,碰到一个新题的时候,可以往之前做过的题方向靠! 打家劫舍问题模型: 不能选择相邻的两个数,并且要最终…

基于javaweb的SSM羽毛球会员俱乐部系统场馆课程运动设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

windows下git bash安装SDKMan报错Looking for unzip...Not found

需要在jdk8和jdk17两个版本切换。最简单的是通过手动切换,但切换过程太繁琐,修改环境变量,达到切换目的。于是尝试其它解决方案,最终确实使用sdkman工具。 确保安装了git Git - Downloading Package 记住安装的路径,…

rnn的音频降噪背后技术原理

rnniose: 这个演示展示了 RNNoise 项目,说明了如何将深度学习应用于噪声抑制。其核心理念是将经典的信号处理方法与深度学习结合,打造一个小巧、快速的实时噪声抑制算法。它不需要昂贵的 GPU —— 在树莓派上就能轻松运行。 相比传统的噪声抑制系统&…

剑指Offer(数据结构与算法面试题精讲)C++版——day3

剑指Offer(数据结构与算法面试题精讲)C版——day3 题目一:数组中和为0的3个数字题目二:和大于或等于k的最短子数组题目三:乘积小于k的子数组 题目一:数组中和为0的3个数字 前面我们提到,在一个排…

全新UI好看404页面源码

源码介绍 全新UI好看404页面源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行 效果预览 源码获取 全新UI好看404页面源码

递归典例---汉诺塔

https://ybt.ssoier.cn/problem_show.php?pid1205 #include<bits/stdc.h> #define endl \n #define pii pair<int,int>using namespace std; using ll long long;void move(int n,char a,char b,char c) // n 个盘子&#xff0c;通过 b&#xff0c;从 a 移动到 …

php的高速缓存

部署方法 在我们安装的nginx中默认不支持memc和srcache功能&#xff0c;需要借助第三方模块来让nginx支持此功能。 tar zxf srcache-nginx-module-0.33.tar.gz tar zxf memc-nginx-module-0.20.tar.gz 下载这俩个模块&#xff0c;然后编译安装的时候加进去 编译安装完成之后…

视频设备轨迹回放平台EasyCVR打造视频智能融合新平台,驱动智慧机场迈向数字新时代

一、行业背景​ 随着 5G、AI、物联网、大数据等前沿技术的不断更新换代&#xff0c;交通行业进入数字化转型的高速发展时期。航空业作为交通领域的重要部分&#xff0c;数字化进程从追求速度往注重质量的转变。但机场在数字化转型中面临许多严峻挑战&#xff0c;如现有运营模式…

【论文阅读】Anchor Graph Network for Incomplete Multiview Clustering

摘要 近年来&#xff0c;不完全多视图聚类&#xff08;IMVC&#xff09;受到广泛关注。然而&#xff0c;现有研究仍然存在以下几个不足之处&#xff1a;1) 部分方法忽略了样本对在全局结构分布中的关联性&#xff1b;2) 许多方法计算成本较高&#xff0c;因此无法应用于大规模…

15. 远程服务器运行jemter的GUI方式

1. 问题 在 linux 服务器或远程服务器上&#xff0c;安装 Jmeter&#xff0c;打不开 Jmeter 的 GUI 界面。 环境&#xff1a; linux 服务器mac 电脑 需求&#xff1a;在远程服务器中&#xff0c;启动 jmeter&#xff08;./bin/jmeter &&#xff09;后&#xff0c;在 ma…

Ansible:playbook的高级用法

文章目录 1. handlers与notify2. tags组件3. playbook中使用变量3.1使用 setup 模块中变量3.2在playbook 命令行中定义变量3.3在playbook文件中定义变量3.4使用变量文件3.5主机清单文件中定义变量主机变量组&#xff08;公共&#xff09;变量 1. handlers与notify Handlers&am…

什么是msvcp140.dll?msvcp140.dll丢失的解决方法又有哪些?

msvcp140.dll 是 Microsoft Visual C Redistributable 的核心动态链接库文件&#xff0c;许多软件和游戏依赖它来运行。当系统提示“msvcp140.dll丢失”时&#xff0c;意味着该文件无法被正确加载&#xff0c;导致程序崩溃或无法启动。本文将提供最全面的 msvcp140.dll丢失的解…

(九)图形管线

一图说明问题 顶点数据->顶点着色器->细分着色器->几何着色器->光栅化->片元着色器->颜色混合 创建图形管线函数放在后面位置 void MyApplication::initVulkan() { createInstance(); createSurface(); pickPhysicalDevice(); createLogicalDevice(); cre…

《inZOI(云族裔)》50+MOD整合包

载具 RebelCore - 年龄和时间 mod启动器 优化补丁 去除雾气 坦克模型 菜单 前置 跳过启动 更好性能 等 共计50MOD整合 在游戏的世界里&#xff0c;追求更丰富、更优质的体验是玩家们永恒的主题。RebelCore 这款游戏通过精心打造的 50MOD 整合&#xff0c;为玩家带来了前所未有的…

国家天文台携手阿里云,发布国际首个太阳大模型“金乌”

2025年4月1日&#xff0c;中国科学院国家天文台与阿里云共同宣布推出全球首个太阳物理大模型“金乌”&#xff0c;在太阳活动预测领域实现颠覆性突破——其针对破坏性最强的M5级太阳耀斑预报准确率高达91%&#xff0c;远超传统数值模型&#xff0c;标志着人类对太阳的认知迈入“…

U盘实现——BOT 常用命令

文章目录 U盘实现——BOT 常用命令命令格式CBWCSW数据传输条件命令传输数据传输状态传输命令汇总INQUIRY Command:12h数据格式抓包READ FORMAT CAPACITIES Command: 23h数据格式抓包READ CAPACITY Command: 25h数据格式抓包TEST UNIT READY Command: 00h数据格式抓包WRITE(10) …

【Axure元件分享】月份范围选择器

Axure月份范围选择器是一个月份范围下拉筛选元件&#xff0c;支持月份范围定义选择。组件自动加载系统当前年月份作为默认值&#xff0c;用户可通过箭头图标或键盘快捷键快速切换年份月份&#xff0c;其样式支持高度定制&#xff0c;包括颜色主题、字体尺寸及交互反馈&#xff…

JavaScript基础-移动端常用开发框架

随着移动互联网的发展&#xff0c;越来越多的应用和服务需要支持移动设备。为了提高开发效率和用户体验&#xff0c;开发者们依赖于一些成熟的JavaScript框架来构建响应迅速、功能丰富的移动Web应用。本文将介绍几款广泛使用的移动端开发框架&#xff0c;并通过具体的示例展示它…

数字人训练数据修正和查看 不需要GPU也能运行的DH_live-加载自己训练-

自己训练模pth报错 le "D:\ai\dh_live\app.py", line 42, in demo_mini interface_mini(asset_path, wav_path, output_video_name) File "D:\ai\dh_live\demo_mini.py", line 21, in interface_mini renderModel_mini.loadModel("checkpoi…