工具-百度云盘服务-身份认证

目标

通过百度网盘API的方式去获取网盘中的文件,要实现这的第一步就是需要获取网盘的权限。

资料(参考)

如果期望应用访问用户的网盘文件,则需要经过用户同意,这个流程被称为“授权”。百度网盘开放平台基于 OAuth2.0 接入授权。OAuth2.0 是一种授权协议,通过该协议用户可以授权开发者应用访问个人网盘信息与文件。
用户同意授权后,开发者应用会获取到一个 Access Token,该 Access Token 是用户同意授权的凭证。开发者应用需要依赖 Access Token 凭证调用百度网盘公开API,实现访问用户网盘信息与授权资源。
关于实现用户授权,您可以选择授权码模式、简化模式或者设备码模式实现。
当前百度网盘开放平台支持三种授权模式:授权码模式(Authorization Code)、简化模式(Implicit Grant)、设备码模式(Device Code)。您可以根据自身业务,选择合适的授权模式,实现用户授权。
授权模式描述使用场景有效期
授权码模式(Authorization Code)用户授权后生成授权码 Code,开发者应用通过 Code 换取 Access Token。适用于 有 Server 端 的应用。Access Token 有效期30天,过期后支持刷新。
简化模式(Implicit Grant)无需通过 Code 换取 Access Token,直接获取 Access Token。适用于 无 Server 端配合 的应用。Access Token 有效期30天,过期后不支持刷新, 用户需重新登录授权。
设备码模式(Device Code)获取设备码,用户授权后,开发者应用通过设备码换取 Access Token。适用于 弱输入设备 的应用(不支持浏览器或输入受限的设备,如儿童手表)。Device Code只能使用一次,Access Token过期后支持刷新。
授权注意事项:
  • Access Token 有效期30天,过期后支持刷新,刷新后的 Access Token 有效期仍为 30 天。
  • 刷新Access Token请按需刷新,不需要不停的刷新。
  • 刷新请求,如果API返回失败,旧的refresh_token会失效,此时需要重新发起授权请求,获取新的 Access Token、refresh_token,而不是使用旧的 refresh_token 循环再发起刷新请求。
  • refresh_token 只支持使用一次,refresh_token 使用后失效,下次刷新 Access Token 时需要使用上一次刷新请求响应中的 refresh_token。

准备

在授权之前,您需要先完成创建自己的应用。
主要包括以下流程:

  1. 进入百度网盘开放平台,点击右上角 “申请接入”。
  2. 登录您的百度帐号。
  3. 完成开发者认证,我们提供了两种认证类型供您选择:个人认证、企业认证。
  4. 前往控制台创建自己的应用,生成AppID、AppKey、SecretKey、SignKey等信息。
    目前个人认证下可最多创建 2 个应用,企业认证下可最多创建 10 个应用。
    可创建两种类型的应用:硬件应用和软件应用。
  5. 至此,完成应用的创建。

实现逻辑

授权码模式适用于有 Server 端的应用。我们这次实现是选用的授权码模式。
开发者应用在获取用户的授权码 Code 之后,通过 Code 换取 Access Token 凭证
Access Token 有效期30天,过期后支持刷新,刷新后的 Access Token 有效期仍为 30 天,刷新Access Token请按需刷新,不需要不停的刷新。
刷新请求,如果API返回失败,旧的refresh_token会失效,此时需要重新发起授权请求,获取新的 Access Token、refresh_token,而不是使用旧的 refresh_token 循环再发起刷新请求。
refresh_token 只支持使用一次,refresh_token 使用后失效,下次刷新 Access Token 时需要使用上一次刷新请求响应中的refresh_token。
获取到的授权码 code 有效期 10 分钟,且仅一次有效。
简单介绍时序图的流程,如下:

  1. 用户选择通过百度账号登录开发者应用。
  2. 开发者应用发起授权码 Code 请求。
  3. 百度 OAuth 服务器展示授权页面给用户,用户登录并同意授权。
  4. 用户同意授权后,百度 OAuth 服务器会将页面跳转至开发者应用配置的回调地址,返回授权码 Code。
  5. 开发者应用发起 Code 换取 Access Token 请求。
  6. 百度 OAuth 服务器返回 Access Token 凭证。
    授权码模式

实现步骤:

  1. 获取授权码,需要页面登录认证,且需要传入参数(授权码只可用一次)
    登录链接格式: https://openapi.baidu.com/oauth/2.0/authorize?client_id=app_key&device_id=app_id&errmsg=Auth+Login+Ptoken+Error&errno=10&redirect_uri=oob&response_type=code&scope=basic%2Cnetdisk&ssnerror=1
    需要传入参数(后面几个参数可以固定)为: device_id client_id redirect_uri=oob response_type=code scope=basic,netdisk
	# 1. 获取授权码 需页面登录认证def get_authorization_code(self):import requestsurl = 'http://openapi.baidu.com/oauth/2.0/authorize'payload = {'response_type':'code','device_id': self.device_id,'client_id': self.client_id,'scope': 'basic, netdisk','redirect_uri': 'oob'}headers = {'User-Agent': 'pan.baidu.com'}print(url)response = requests.request("GET", url, headers=headers, data=payload)print(response.text)
  1. 使用授权码换取AccessToken凭证
    上面资料中提到token的有效期是30天,该请求会返回一个refresh_token值,由于后续刷新需要上一次的值,所以后续我们需要考虑把这个值保存到本地。
	# 2. 换取AccessToken凭证 将token信息保存到本地,支持后续读取更新def oauthtoken_authorizationcode(self, file_path = 'tokens.json'):with openapi_client.ApiClient() as api_client:api_instance = auth_api.AuthApi(api_client)code = self.codeclient_id = self.client_idclient_secret = self.client_secretredirect_uri = self.redirect_uritry:api_response = api_instance.oauth_token_code2token(code, client_id, client_secret, redirect_uri)access_token = self.save_tokens_info(api_response, file_path)return access_token, file_pathexcept openapi_client.ApiException as e:print("使用code换取AccessToken凭证失败: %s\n" % e)
  1. 刷新AccessToken
    由于获取授权码需要页面验证,开发使用时很不方便,所以需要把token信息保存到本地,用了支撑刷新及更新token
    实现
	# 3. 刷新 Access Token 将token信息保存到本地def oauthtoken_refreshtoken(self, file_path = 'tokens.json'):with open(file_path, 'r') as f:data = json.load(f)print(data)if (datetime.datetime.strptime(data['expires_time'], "%Y-%m-%d %H:%M:%S") > datetime.datetime.now()):print('access_token:',data['access_token'],',未过期,过期时间:',data['expires_time'])return data['access_token']else:with openapi_client.ApiClient() as api_client:api_instance = auth_api.AuthApi(api_client)refresh_token = data['refresh_token']client_id = self.client_idclient_secret = self.client_secrettry:api_response = api_instance.oauth_token_refresh_token(refresh_token, client_id, client_secret)access_token = self.save_tokens_info(api_response, file_path)return access_tokenexcept openapi_client.ApiException as e:print("刷新Access Token失败: %s\n" % e)

工具函数: 保存到本地

# 将token信息保存下来def save_tokens_info(self, api_response, file_path):tokens_dict = {'access_token': api_response.access_token,'expires_in': api_response.expires_in,'expires_time': (datetime.datetime.now() + datetime.timedelta(seconds=api_response.expires_in)).strftime("%Y-%m-%d %H:%M:%S"),'refresh_token': api_response.refresh_token,'scope': api_response.scope,'session_key': api_response.session_key,'session_secret': api_response.session_secret}print('tokens信息为:', tokens_dict)# 将数据写入json文件with open(file_path, 'w') as f:json.dump(tokens_dict, f)print('tokens结果保存到本地:', file_path)return api_response.access_token

最终运行

if __name__ == '__main__':client = Baidu()client.oauthtoken_authorizationcode()client.oauthtoken_refreshtoken()

总结

在调试过程时,一次性code和一次性refresh使用时很不便利,这两个变量不是时效性的,是需要注意的。

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

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

相关文章

关于分布式分片,你该知道的事儿

关于分布式分片,你该知道的事儿 前言一、关于分片方式的那些事儿1.1 按照Hash划分1.2 按照区间范围划分1.3 按照数据量划分1.4 来些例子1.4.1 Redis的分片划分1.4.2 Mongo的分片划分 二、关于分区再平衡的那些事儿2.1 基于固定分片数量2.2 基于动态分片数量2.3 基于…

计算机毕业设计 | SSM 在线毕业论文管理 线上考试成绩教务管理系统(附源码)

1, 绪论 研究背景 系统管理也都将通过计算机进行整体智能化操作,对于论文管理系统所牵扯的管理及数据保存都是非常多的,例如管理员;首页、系统用户(管理员、学生、老师)模块管理(指导教师、课…

为什么不要使用elasticsearch

互联网上有很多文章,都在讲为什么要使用elasticsearch,却很少有人讲为什么不要使用elasticsearch。作为深入研究elasticsearch四年,负责公司万亿级别检索的操盘手,借着这篇文章,给大家分享一下,为什么不要使…

Vue3全家桶 - VueRouter - 【2】重定向路由

重定向路由 在路由规则数组中,可采用 redirect 来重定向到另一个地址: 通常是将 / 重定向到 某个页面; 示例展示: router/index.js:import { createRouter, createWebHashHistory, createWebHistory } from vue-route…

混合测试写一写

题目 服务器IP地址规划:client:12.0.0.12/24,网关服务器:ens36:12.0.0.1/24、ens33:192.168.44.1/24,Web1:192.168.44.30/24,Web2:192.168.44.50/24,Nginx&am…

iOS应用内的沙盒目录

iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件,在开发中常常需要数据存储的功能,比如存取文件,归档解档等,因此有必要熟悉沙盒目录及其作用。 Documents目录 开发者可以将应用程序的数据文件保存在这个目录下.…

bzm - Concurrency Thread Group 阶梯式压测

bzm - Concurrency Thread Group 不是JMeter的官方插件,而是一种由Blazemeter提供的高级线程组插件,它提供了更灵活的并发性能测试设置。它可以在不同的时间内并发执行不同数量的线程,模拟不同的负载场景 插件下载地址:Download …

加速 Webpack 构建:提升效率的秘诀

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

网络通信另个角度的认识(进程间通信),端口号(为什么要有,和pid的关系,分类,如何封装,和进程的定位原理+对应关系),客户端如何拿到服务端的port

目录 另一个角度认识网络通信 端口号 引入 -- 为什么要有端口号 问题 解决 端口号和pid 举例 介绍 分类 知名端口 注册端口 动态端口 客户端如何知道服务端的端口号 封装端口号 定位原理 进程和端口号的对应关系 数据如何被上层进程读到 另一个角度认识网络…

【Java EE初阶十一】多线程进阶二(CAS等)

1. 关于CAS CAS: 全称Compare and swap,字面意思:”比较并交换“,且比较交换的是寄存器和内存; 一个 CAS 涉及到以下操作: 下面通过语法来进一步进项说明: 下面有一个内存M,和两个寄存器A,B; CAS(M,A,B)&am…

吴恩达机器学习-可选实验:梯度下降逻辑回归(Gradient Descent for Logistic Regression)

文章目录 目标数据集Logistic梯度下降梯度下降实现计算梯度,代码描述 另一个数据集 目标 在本实验中,你将: 更新逻辑回归的梯度下降在一个熟悉的数据集上探索梯度下降使用梯度下降给逻辑回归更新参数 import copy, math import numpy as np %matplotl…

怎么判断你的模型是好是坏?模型性能评估指标大全!

模型性能评估指标,大家一定不陌生!很多小伙伴们都说难,但是它真的很重要很重要很重要!它会对我们的模型有很多的指导,也会给我们真正做模型的时候提供一些指导性的思想,不然我们看到别人的东西只能跟着人家…

【linux】冯诺依曼体系与操作系统的理解

本篇文章是进程的预备知识,但也不仅仅是进程的预备知识, 也可以更好地帮助我们理解整个计算机体系。 目录 冯诺依曼体系结构:进一步理解操作系统: 冯诺依曼体系结构: 关于这张图先进行一下必要的解释: 输…

怎样通过IT服务台来增强IT项目管理?

当下,越来越多的企业和组织重视IT项目管理的重要性。而如何通过IT服务台来增强和提升IT项目管理效率,成为了许多企业领导和IT专业人员共同关注的话题。如何充分利用IT服务台,以促进IT项目管理水平的提升和项目成功率的增加变得至关重要。 1…

怎么免费下载无水印视频素材?赶快收藏这六个网站。

今天来教大家怎么下载无水印视频素材,其中一些是免费的,并且可以在商业项目中使用,这些网站都是无水印视频素材,可以放心使用。 蛙学网: 网站的内容非常丰富多彩,包括风景,夜景,食物…

论文阅读:Editing Large Language Models: Problems, Methods, and Opportunities

Editing Large Language Models: Problems, Methods, and Opportunities 论文链接 代码链接 摘要 由于大语言模型(LLM)中可能存在一些过时的、不适当的和错误的信息,所以有必要纠正模型中的相关信息。如何高效地修改模型中的相关信息而不影…

java学习(Arrays类和System类)

目录 目录 一.Arrays类 二.System常见方法 三、Biglnteger和BigDecimal(高精度) 1.Biglnter的常用方法 2.BigDecimal常见方法 3.日期类 1)第一代日期类 2)第二代日期类 3)第三代日期类 一.Arrays类 Arrays包含了一系 列静态方法&am…

11、Linux-安装和配置Redis

目录 第一步,传输文件和解压 第二步,安装gcc编译器 第三步,编译Redis 第四步,安装Redis服务 第五步,配置Redis ①开启后台启动 ②关闭保护模式(关闭之后才可以远程连接Redis) ③设置远程…

12双体系Java学习之局部变量和作用域

局部变量 局部变量的作用域 参数变量