新闻中心
解决BunnyStream TUS视频上传401认证错误:完整指南

本文旨在解决使用tus协议上传视频至bunnystream服务时遇到的401认证错误。核心问题通常源于api密钥、授权签名、过期时间戳、视频库id等参数配置不当。教程将详细阐述如何正确配置这些认证参数,包括api密钥的获取、unix时间戳的计算、sha256签名的生成,并提供修正后的j*ascript代码示例,同时强调“受信任站点”的重要性,确保您能顺利完成bunnystream的视频上传。
BunnyStream TUS上传认证问题排查与解决
在使用TUS协议上传视频到BunnyStream服务时,开发者可能会遇到“Error: tus: unexpected response while creating upload, originated from request (method: POST, url: https://www.php.cn/link/92b1f191dfce9fff64b4effd954ccaab, response code: 401, response text: , request id: n/a)”这样的401 Unauthorized错误。这通常意味着上传请求未能通过BunnyStream的身份验证。本文将深入解析导致此问题的原因,并提供一套完整的解决方案。
1. 理解BunnyStream TUS上传的认证机制
BunnyStream的TUS上传API要求在请求头中包含特定的认证信息,以确保只有授权用户才能上传内容。这些关键信息包括:
- AuthorizationSignature: 一个SHA256签名,用于验证请求的合法性。
- AuthorizationExpire: 签名和请求的过期时间,必须是Unix时间戳。
- VideoId: 预先通过BunnyStream API创建的视频对象的GUID。
- LibraryId: 目标视频库的ID。
任何这些参数的错误配置都可能导致401认证失败。
2. 核心参数的正确配置
2.1 API密钥 (AccessKey)
在您的代码中,AccessKey变量必须替换为您的BunnyCDN API密钥。请注意,这通常是您的账户API密钥或具有视频管理权限的视频API密钥。您可以在BunnyCDN控制面板中找到并生成这些密钥。切勿使用其他非API密钥的凭证。
2.2 授权过期时间 (AuthorizationExpire)
AuthorizationExpire参数必须是一个Unix时间戳,表示签名和请求的有效截止时间。这个时间戳应该是未来的某个时间点,例如,当前时间加上一天。
计算方法: 获取当前时间(毫秒),除以1000转换为秒,然后加上希望的有效时长(例如,一天是24 * 60 * 60秒)。
// 获取当前Unix时间戳(秒) const currentTimeInSeconds = Math.floor(Date.now() / 1000); // 设置过期时间为当前时间+1天 const expirationTime = currentTimeInSeconds + (24 * 60 * 60); // 1天 = 86400秒
2.3 授权签名 (AuthorizationSignature)
AuthorizationSignature是通过SHA256算法对特定字符串进行哈希处理后生成。这个字符串的组成顺序和内容至关重要:
SHA256(library_id + api_key + expiration_time + video_id)
来画数字人|直播|
来画数字人自动化|直播|,无需请真人主播,即可实现24小时|直播|,无缝衔接各大|直播|平台。
57
查看详情
注意:
- library_id:您的视频库ID。
- api_key:您的BunnyCDN API密钥(与AccessKey相同)。
- expiration_time:您在AuthorizationExpire中设置的Unix时间戳。
- video_id:您预先创建的视频对象的GUID。
务必确保在生成签名时,api_key和expiration_time与请求头中实际发送的值完全一致。
2.4 视频库ID (LibraryId) 和视频ID (VideoId)
- LibraryId: 这是您在BunnyCDN中创建的视频库的唯一标识符。您可以在BunnyCDN控制面板的“Stream”部分找到它。
- VideoId: 在执行TUS上传之前,您需要先调用BunnyStream的“Create Video”API来创建一个视频占位符。该API会返回一个GUID,这就是VideoId。
3. 修正后的代码示例
以下是根据上述说明修正后的J*aScript TUS上传代码示例:
// 确保您已经引入了TUS客户端库和SHA256哈希库
// 例如:
// <script src="https://cdn.jsdelivr.net/npm/tus-js-client@latest/dist/tus.min.js"></script>
// <script src="https://cdnjs.cloudflare.com/ajax/libs/js-sha256/0.9.0/sha256.min.js"></script>
// TODO: 请替换为您的实际BunnyCDN API密钥和视频库ID
const YOUR_BUNNYCDN_API_KEY = "YOUR_BUNNYCDN_API_KEY_HERE"; // 例如:'YOUR_API_KEY'
const YOUR_VIDEO_LIBRARY_ID = "YOUR_VIDEO_LIBRARY_ID_HERE"; // 例如:12345
/**
* 上传视频到BunnyStream服务
* @param {File} file - 要上传的File对象
* @param {object} videoDetails - 包含视频GUID的对象,例如 { guid: "pre-created-video-guid" }
* @param {string} [collectionId] - 可选,视频所属的集合ID
* @param {string} [libraryID] - 可选,覆盖默认的视频库ID
*/
function UploadVideo(file, videoDetails, collectionId, libraryID){
// 使用传入的libraryID或默认值
const currentLibraryID = libraryID || YOUR_VIDEO_LIBRARY_ID;
// 1. 计算授权过期时间(Unix时间戳,秒)
// 例如,设置为当前时间后的24小时
const expirationTime = Math.floor(Date.now() / 1000) + (24 * 60 * 60);
// 2. 获取预创建的视频GUID
const videoGuid = videoDetails.guid;
// 3. 生成SHA256签名
// 签名字符串格式: library_id + api_key + expiration_time + video_id
const signaturePayload = currentLibraryID + YOUR_BUNNYCDN_API_KEY + expirationTime + videoGuid;
const AuthorizationSignature = sha256(signaturePayload); // 假设sha256函数已全局可用
// 创建一个新的tus上传实例
var upload = new tus.Upload(file, {
endpoint: "https://www.php.cn/link/92b1f191dfce9fff64b4effd954ccaab",
retryDelays: [0, 3000, 5000, 10000, 20000, 60000, 60000], // 重试策略
headers: {
// 认证相关头部
AuthorizationSignature: AuthorizationSignature,
AuthorizationExpire: expirationTime,
VideoId: videoGuid,
LibraryId: currentLibraryID,
},
metadata: {
// 元数据,可选
filetype: file.type,
title: 'My Uploaded Video Title', // 视频标题
collection: collectionId // 如果有集合ID,可以添加
},
onError: function (error) {
console.error("TUS上传发生错误:", error);
// 在此处处理错误,例如向用户显示错误消息
},
onProgress: function (bytesUploaded, bytesTotal) {
var percentage = (bytesUploaded / bytesTotal * 100).toFixed(2);
// 假设页面中存在一个ID为'progressBar'的元素来显示进度
// const progressBar = document.getElementById('progressBar');
// if (progressBar) progressBar.style.width = percentage + "%";
console.log(`已上传: ${bytesUploaded} bytes, 总共: ${bytesTotal} bytes, 进度: ${percentage}%`);
},
onSuccess: () => {
console.log('文件上传成功!');
// 在此处处理上传成功后的逻辑
}
});
// 检查是否有之前中断的上传可以继续
upload.findPreviousUploads().then(function (previousUploads) {
if (previousUploads.length) {
console.log("检测到之前未完成的上传,将继续上传。");
upload.resumeFromPreviousUpload(previousUploads[0]);
}
// 开始上传
upload.start();
}).catch(error => {
console.error("查找或开始上传时发生错误:", error);
});
}
// 示例用法(在实际应用中,file、videoDetails和collectionId将由用户输入或API调用提供)
/*
// 假设您有一个File对象
const myFile = new File(["dummy content"], "example.mp4", { type: "video/mp4" });
// 假设您已经通过BunnyStream API创建了一个视频并获取了其GUID
const myVideoDetails = { guid: "YOUR_PRE_CREATED_VIDEO_GUID" };
// 可选的集合ID
const myCollectionId = "YOUR_COLLECTION_ID";
// 调用上传函数
UploadVideo(myFile, myVideoDetails, myCollectionId);
*/4. 受信任站点配置
除了正确的认证参数,BunnyCDN还提供了“受信任站点”的安全功能。如果您在本地开发环境或特定域名下进行测试,并且BunnyCDN配置了受信任站点策略,那么您需要将您的测试域名或localhost添加到BunnyCDN的受信任站点列表中。否则,即使认证参数正确,请求也可能被拒绝。
配置路径: 登录BunnyCDN控制面板 -> Stream -> 您的视频库 -> 安全 -> 受信任站点。
5. 总结与注意事项
-
API密钥的准确性: 确保使用的API密钥是正确的BunnyCD
N密钥,并且拥有必要的上传权限。 - 时间戳的动态性: AuthorizationExpire必须是一个未来的Unix时间戳,并且在签名生成和请求头中保持一致。
- 签名字符串的精确性: SHA256签名必须严格按照library_id + api_key + expiration_time + video_id的顺序和内容生成。任何字符或顺序的错误都会导致签名无效。
- 预创建视频: TUS上传前必须先通过BunnyStream API预创建一个视频占位符,以获取VideoId。
- 受信任站点: 根据您的环境配置BunnyCDN的受信任站点列表。
- 错误日志: 仔细检查浏览器的开发者工具控制台,TUS库的onError回调会提供详细的错误信息,有助于进一步排查问题。
通过遵循上述指南,您应该能够成功解决BunnyStream TUS视频上传的401认证错误,并顺利完成视频上传任务。
以上就是解决BunnyStream TUS视频上传401认证错误:完整指南的详细内容,更多请关注其它相关文章!
# java
# js
# ajax
# npm
# javascript
# 您在
# 如何实现
# 可选
# 您的
# 上传
# stream
# unix
# ai
# 工具
# access
# 浏览器
# cdn
# 您已经
# seo5g
# 微信里的seo
# 姚玉兰seo
# 平谷区自动网站建设配置
# 海口自建网站推广公司
# 山西电商网站推广销售
# 美国购物推广网站排名
# 您需要
# 您可以
# 创建一个
# 是一个
# sem与seo 推广
# 百度关键词排名策略
# 为什么要做营销推广呢
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
黑猫投诉统一入口官网 消费者权益保护投诉平台
抖音怎么赚钱_抖音创作者变现方法与途径指南
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
b站怎么删除评论_b站评论管理与删除操作
Win11怎么开启省电模式_Win11电池节电模式自动开启
Lar*el 8 多关键词数据库搜索优化实践
Mac怎么查看崩溃日志_Mac控制台错误报告分析
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
星露谷物语官网入口 星露谷物语游戏官网入口
天猫2025双十一0点秒杀攻略 天猫爆款抢购时间
Pandas DataFrame:高效添加条件计算列
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
理解Python模块与全局变量的作用域管理
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
AngularJS $http POST请求数据传递与Go后端接收实践
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
12306几点到几点不能订票? | 官方最新系统维护时间全解析
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
如何在Python中使用Optional类型处理可变对象并避免Pylint警告
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
一加 14R 快充无反应_一加 14R 充电优化
12306选座系统怎么选连座_12306选座多人连坐操作方法
汽水音乐在线版入口_汽水音乐网页播放手册
TikTok网页版直接登录 TikTok网页端官方平台入口
《主播少女的秘密账号迷宫》首支宣传片
c++如何使用Meson构建系统_c++比CMake更快的构建工具
Steam官网入口直达 Steam注册及登录步骤
AO3中文官网链接_AO3网页版稳定镜像站
如何在Promise链中有效终止错误处理后的执行
必由学官网首页入口 必由学教师网页版登录指南
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
如何使用Go和Martini动态服务解码后的图片
抖音极速版最新版本 抖音极速版官方下载地址
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
Golang如何使用context实现超时取消_Golang context超时取消模式实践
Log4j Console Appender性能瓶颈与高并发优化策略
初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解
MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
解决Django多数据库/多Schema环境下外键迁移问题
PHP 枚举:根据字符串获取枚举案例的策略与实现
响应式容器内容自动缩放与宽高比维持教程
mc.js官网登录入口 mc.js官方登录入口最新版


2025-11-29
浏览次数:次
返回列表
N密钥,并且拥有必要的上传权限。