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

news2025/2/22 8:45:43

目标

通过百度网盘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 requests
        url = '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.code
            client_id = self.client_id
            client_secret = self.client_secret
            redirect_uri = self.redirect_uri
            try:
                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_path
            except 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_id
                client_secret = self.client_secret
                try:
                    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_token
                except 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.coloradmin.cn/o/1511469.html

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

相关文章

Promise图解,Pass

10-优化代码_哔哩哔哩_bilibili

STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹

STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹前言第1章 添加文件夹第2章 添加文件路径2.1 相对路径方法2.2 绝对路径方法 总结 前言 在编程的过程中,如果需要在原有的工程基础上新增其它的…

【Java从入门到精通】Java数组

数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。 Java 语言中提供的数组是用来存储固定大小的同类型元素。 你可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 number0&#xff0…

数据结构和算法:复杂度分析

算法效率评估 时间效率:算法运行速度的快慢。 空间效率:算法占用内存空间的大小。 效率评估方法主要分为两种:实际测试、理论估算 实际测试问题: 1.难以排除测试环境的干扰因素。 硬件配置会影响算法的性能。需要在各种机器上进…

第五十六回 徐宁教使钩镰枪 宋江大破连环马-飞桨图像分类套件PaddleClas初探

宋江等人学会了钩镰枪,大胜呼延灼。呼延灼损失了很多人马,不敢回京,一个人去青州找慕容知府。一天在路上住店,马被桃花山的人偷走了,于是到了青州,带领官兵去打莲花山。 莲花山的周通打不过呼延灼&#xf…

vivado 使用Design Runs窗口、

使用Design Runs窗口 “设计运行”窗口显示在项目中创建的所有合成和实现运行。它包括用于配置、管理和启动运行的命令。 打开Design Run窗口 选择窗口 →  Design Runs打开“Design Runs”窗口。 设计运行窗口功能 •每个实现运行都缩进显示在其子级的合成运行下面。 …

[Java、Android面试]_01_多线程: 重要参数、状态、优雅停止线程等

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料,感兴趣的朋友可收藏关注, 现分享如下: 文章目录 1. 线程池重要参数2. 线程池状态3. 优雅停止线程4. 线…

【Qt学习笔记】(二)--第一个程序“Hello World”(学习Qt中程序的运行、发布、编译过程)

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    因为我个人对Qt也是有一些需求,所以开设本专栏进行学习,希望大家可以一起学习,共同进步。   这篇博客将从一个 He…

HTML 学习笔记(十一)表单

一、分块 1.单行文本框控件–文本框和密码框 文本框控件通过单标签input实现,其具有必要属性type来控制输入控件的类型(默认为text即文本信息),密码框的type为password(口令)。   表单的动作属性定义了目的文件的文件名。由动作属性定义的这个文件通常…

Qt QDateTime类使用

一.Qt datetime 介绍 Qt中的QDateTime类是用于处理日期和时间的组合的类,它提供了丰富的功能来操作和格式化日期时间数据。以下是其主要特点和用法: 构造函数:QDateTime可以通过组合QDate(日期)和QTime(时…

C++感受2-逐字逐句,深入理解C++最小例程

以 “Hello World” 例程为载体、线索,在完成 “间接名字空间限定” 写法转换到“直接名字空间限定”的过程,同时掌握函数、主函数、函数调用、级联操作、声明、类型、int、字符串类型、头文件包含、行为数据、流输出操作符、标准输出流对象、标准库名字…

LeetCode.2129. 将标题首字母大写

&#x1f354;题目 2129. 将标题首字母大写 &#x1f35f;分析 这道题目描述的很清晰&#xff0c;我们只需要将给定的字符串按照空格划分成字符串数组 str&#xff0c;然后判断 str[i] 的长度如果 <2 &#xff0c;则将 str[i] 转为小写&#xff0c;如果 str[i] 的长度 &g…

Python批量提取Word文档表格数据

在大数据处理与信息抽取领域中&#xff0c;Word文档是各类机构和个人普遍采用的一种信息存储格式&#xff0c;其中包含了大量的结构化和半结构化数据&#xff0c;如各类报告、调查问卷结果、项目计划等。这些文档中的表格往往承载了关键的数据信息&#xff0c;如统计数据、项目…

CSS 用 flex 布局绘制骰子

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.box {height: 100px;width: 100px;border: 2px solid grey;border-radius: 10px;display: flex;justify-content: center; // 水平居中/* alig…

new-easy(pwn)

1.进行查壳 栈保护&#xff0c;三个保护都开了 NX保护 NX保护在Windows中也被成为称为DEP&#xff0c;是通过现代操作系统的内存单元&#xff08;Memory Protect Unit &#xff0c;MPU&#xff09;机制对程序内存页的粒度进行权限设置&#xff0c;其基本规则为可写权限与可执…

简述类与对象

一、两者关系 类是Java语言中最重要的数据类型&#xff0c;用于创建具体实例&#xff08;对象&#xff09; 抽象出一类事物共有的属性和行为&#xff0c;即数据以及数据上的操作 类是对现实事物的模拟&#xff0c;包含属性&#xff08;成员变量&#xff09;和行为&#xff0…

python读取大型csv文件,降低内存占用,提高程序处理速度

文章目录 简介读取前多少行读取属性列逐块读取整个文件总结参考资料 简介 遇到大型的csv文件时&#xff0c;pandas会把该文件全部加载进内存&#xff0c;从而导致程序运行速度变慢。 本文提供了批量读取csv文件、读取属性列的方法&#xff0c;减轻内存占用情况。 import pand…

2024.3.12 C++

1.思维导图 2.自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height),定义公有成员函数: 初始化函数:void init(int w, int h)更改宽度的函数:set_w(int w)更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <iostream…

python(ogr)处理geojson为本地shp文件

前言 本次所利用的geojson数据来自https://geo.datav.aliyun.com/areas_v3/bound/410000_full.json &#xff0c;如果觉得下方代码看起来不方便&#xff0c;可以来GitHub上来看&#xff0c;在这上面还有一些辅助内容便于理解 GISpjd/GIS-union-Python (github.com)https://gi…

【2024.03.12】定时执行专家 V7.2 发布 - TimingExecutor V7.2 Release

目录 ▉ 软件介绍 ▉ 新版本 V7.2 下载地址 ▉ V7.2 新功能 ▼2024-03-12 V7.2 - 更新日志 ▉ V7.x 新UI设计 ▉ 软件介绍 《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有 25 种【任务类型】、12 种【触发器】触发方式&#x…