
本文旨在解决使用tus协议上传视频至bunnystream服务时遇到的401认证错误。核心问题通常源于api密钥、授权签名、过期时间戳、视频库id等参数配置不当。教程将详细阐述如何正确配置这些认证参数,包括api密钥的获取、unix时间戳的计算、sha256签名的生成,并提供修正后的javascript代码示例,同时强调“受信任站点”的重要性,确保您能顺利完成bunnystream的视频上传。
在使用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的身份验证。本文将深入解析导致此问题的原因,并提供一套完整的解决方案。
BunnyStream的TUS上传API要求在请求头中包含特定的认证信息,以确保只有授权用户才能上传内容。这些关键信息包括:
任何这些参数的错误配置都可能导致401认证失败。
在您的代码中,AccessKey变量必须替换为您的BunnyCDN API密钥。请注意,这通常是您的账户API密钥或具有视频管理权限的视频API密钥。您可以在BunnyCDN控制面板中找到并生成这些密钥。切勿使用其他非API密钥的凭证。
AuthorizationExpire参数必须是一个Unix时间戳,表示签名和请求的有效截止时间。这个时间戳应该是未来的某个时间点,例如,当前时间加上一天。
计算方法: 获取当前时间(毫秒),除以1000转换为秒,然后加上希望的有效时长(例如,一天是24 * 60 * 60秒)。
// 获取当前Unix时间戳(秒) const currentTimeInSeconds = Math.floor(Date.now() / 1000); // 设置过期时间为当前时间+1天 const expirationTime = currentTimeInSeconds + (24 * 60 * 60); // 1天 = 86400秒
AuthorizationSignature是通过SHA256算法对特定字符串进行哈希处理后生成。这个字符串的组成顺序和内容至关重要:
SHA256(library_id + api_key + expiration_time + video_id)
注意:
务必确保在生成签名时,api_key和expiration_time与请求头中实际发送的值完全一致。
以下是根据上述说明修正后的JavaScript 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);
*/除了正确的认证参数,BunnyCDN还提供了“受信任站点”的安全功能。如果您在本地开发环境或特定域名下进行测试,并且BunnyCDN配置了受信任站点策略,那么您需要将您的测试域名或localhost添加到BunnyCDN的受信任站点列表中。否则,即使认证参数正确,请求也可能被拒绝。
配置路径: 登录BunnyCDN控制面板 -> Stream -> 您的视频库 -> 安全 -> 受信任站点。
通过遵循上述指南,您应该能够成功解决BunnyStream TUS视频上传的401认证错误,并顺利完成视频上传任务。
以上就是解决BunnyStream TUS视频上传401认证错误:完整指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号