Unity | API鉴权用到的函数汇总
目录
一、HMAC-SHA1
二、UriEncode
三、Date
四、Content-MD5
五、参数操作
六、阿里云API鉴权
一、HMAC-SHA1
使用 RFC 2104 中定义的 HMAC-SHA1 方法生成带有密钥的哈希值:
private static string CalculateSignature(string secret, string data){byte[] keyBytes = Encoding.UTF8.GetBytes(secret);byte[] dataBytes = Encoding.UTF8.GetBytes(data);using (var hmacsha1 = new HMACSHA1(keyBytes)){byte[] hashBytes = hmacsha1.ComputeHash(dataBytes);// 将哈希值转换为十六进制字符串StringBuilder hexString = new StringBuilder(hashBytes.Length * 2);foreach (byte b in hashBytes){hexString.AppendFormat("{0:x2}", b);}return hexString.ToString();}}
二、UriEncode
按照RFC 3986进行 URI 编码:
private static string Rfc3986Encode(string value)
{// 使用 Uri.EscapeDataString 进行初步编码var encoded = Uri.EscapeDataString(value);// 根据 RFC 3986 的要求替换字符encoded = encoded.Replace("%20", "+");encoded = encoded.Replace("%21", "!");encoded = encoded.Replace("%27", "'");encoded = encoded.Replace("%28", "(");encoded = encoded.Replace("%29", ")");encoded = encoded.Replace("%7E", "~ ");return encoded;
}
三、Date
当前 UTC 时间,以 ISO 8601 yyyyMMddTHHmmssZ 格式表示:
string date = DateTime.UtcNow.ToString("yyyyMMddTHHmmssZ");
HTTP 1.1 协议中规定的 GMT 时间:(示例:Wed, 01 Mar 2006 12:00:00 GMT )
public static string GetCurrentDateTimeInStandardFormat(){// 获取当前时间并转换到指定时区var dateTimeOffset = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(8));// 将日期时间格式化为字符串var formattedDateTime = dateTimeOffset.ToString("yyyy-MM-ddTHH:mm:sszzz");// 替换时区部分的冒号return formattedDateTime.Substring(0, 22) + formattedDateTime.Substring(23);}
四、Content-MD5
RFC 1864 定义的请求体(Body) md5 摘要(128 位二进制表示,并使用 base64 编码):
private static string CalculateMD5(byte[] data){using (var md5 = MD5.Create()){byte[] hashBytes = md5.ComputeHash(data);return Convert.ToBase64String(hashBytes);}}
五、参数操作
对 URL 中所有参数名、参数值单独 UriEncode,按参数名字母升序的顺序,依次将参数名、参数值用 = 及 & 拼接:
private static string ConstructCanonicalQueryString(Dictionary<string, string> queryParams){if (queryParams == null || queryParams.Count == 0)return "";var sortedQueryParams = queryParams.OrderBy(kvp => kvp.Key);var encodedQueryParams = sortedQueryParams.Select(kvp => $"{Rfc3986Encode(kvp.Key)}={Rfc3986Encode(kvp.Value)}");return string.Join("&", encodedQueryParams);}
六、阿里云API鉴权
下方是阿里云上传文件API鉴权及请求示例(其实接入SDK更方便一些)。(阿里云上传文件后路径为https://桶名称.oss-cn-beijing.aliyuncs.com/文件夹/文件)
using UnityEngine;
using System.Collections;
using System.Security.Cryptography;
using System.Text;
using System;
using System.IO;
using UnityEngine.Networking;public class AliYunManager : MonoBehaviour
{private const string OSS_HOST = "oss-cn-beijing.aliyuncs.com";//域名private const string BUCKET_NAME = "*****";//bucket名称private const string ACCESS_KEY_ID = "************";private const string ACCESS_KEY_SECRET = "**************";// Use this for initializationvoid Start(){UploadFileAsync("D:\\FCJProject\\YiDongYanFaBu\\StudentPartner\\StudentPartner\\Bundles\\StandaloneWindows\\DefaultPackage\\5.0.0\\1ba6bb9f41d66f71f7deb9d2d63b29e4.bundle", "/debug/PC/9.92.0");}/// <summary>/// /// </summary>/// <param name="imagePath">本地文件绝对路径</param>/// <param name="bucketPath">需要保存的文件在bucket上的相对路径,前后不需要加'/',也不需要加文件名</param>public void UploadFileAsync(string filePath, string bucketPath){StartCoroutine(UploadFile(filePath, bucketPath));}IEnumerator UploadFile(string filePath, string bucketPath){// Load the image from filebyte[] imageBytes = File.ReadAllBytes(filePath);string fileName = Path.GetFileName(filePath);string bucketFilePath = "/" + bucketPath + "/" + fileName;string url = "https://" + BUCKET_NAME + "." + OSS_HOST + bucketFilePath;string contentMD5 = "";// ToMD5(imageBytes);string contentType = "application/octet-stream";string utcGMT = DateTime.UtcNow.ToString("r");string canonicalizedOSSHeaders = "";string canonicalizedResource = "/" + BUCKET_NAME +bucketFilePath;string authorization = GetAuthorization("PUT", contentMD5, contentType, utcGMT, canonicalizedOSSHeaders, canonicalizedResource);Debug.Log("Authorization: " + authorization);Debug.Log("url: " + url);//Debug.Log("contentMD5: " + contentMD5);// Create UnityWebRequestUnityWebRequest request = new UnityWebRequest(url, "PUT");//request.uploadHandler = new UploadHandlerRaw(imageData);request.downloadHandler = new DownloadHandlerBuffer();// Set headersrequest.SetRequestHeader("Content-Length", imageBytes.Length.ToString());request.SetRequestHeader("Content-Type", contentType);request.SetRequestHeader("Host", BUCKET_NAME + "." + OSS_HOST);request.SetRequestHeader("Date", utcGMT);request.SetRequestHeader("Authorization", authorization);// Set the body of the requestUploadHandlerRaw uploadHandler = new UploadHandlerRaw(imageBytes);uploadHandler.contentType = contentType;request.uploadHandler = uploadHandler;// Send the request and wait for a responseyield return request.SendWebRequest();if (request.result != UnityWebRequest.Result.Success){Debug.LogError($"Error: {request.error}");Debug.LogError($"Response Code: {request.responseCode}");Debug.LogError($"Response Text: {request.downloadHandler.text}");}elseDebug.Log(request.downloadHandler.text);}private string GetAuthorization(string method, string contentMD5, string contentType,string utcGMT, string canonicalizedOSSHeaders, string canonicalizedResource){string data = method + "\n"+ contentMD5 + "\n"+ contentType + "\n"+ utcGMT + "\n"+ canonicalizedOSSHeaders+ canonicalizedResource;Debug.Log("data:"+ data);string signature = ToHMACSHA1_Base64(ACCESS_KEY_SECRET, data);string authorization = "OSS " + ACCESS_KEY_ID + ":" + signature;return authorization;}private static string ToHMACSHA1_Base64(string key, string data){using (HMACSHA1 hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(key))){byte[] dataBuffer = Encoding.UTF8.GetBytes(data);byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);string result = Convert.ToBase64String(hashBytes);return result;}}private static string ToMD5(byte[] data){using (MD5 md5Hash = MD5.Create()){byte[] hashBytes = md5Hash.ComputeHash(data);Debug.Log(hashBytes.Length);return Convert.ToBase64String(hashBytes);}}
}
相关文章:
Unity | API鉴权用到的函数汇总
目录 一、HMAC-SHA1 二、UriEncode 三、Date 四、Content-MD5 五、参数操作 六、阿里云API鉴权 一、HMAC-SHA1 使用 RFC 2104 中定义的 HMAC-SHA1 方法生成带有密钥的哈希值: private static string CalculateSignature(string secret, string data){byte[] k…...
【python】socket通信代码解析
目录 一、socket通信原理 1.1 服务器端 1.2 客户端 二、socket通信主要应用场景 2.1 简单的服务器和客户端通信 2.2 并发服务器 2.3 UDP通信 2.4 文件传输 2.5 HTTP服务器 2.6 邮件发送与接收 2.7 FTP客户端 2.8 P2P文件共享 2.9 网络游戏 三、python中Socket编…...
FastGPT 手动部署错误:MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo
在运行 FastGPT 时,mongodb 报如下错误: MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo 这是因为 mongo 没有解析出来,在 hosts 文件中添加如下信息: 127.0.0.1 mongo 重新运行 FastGPT 即可。 参考链接ÿ…...
用英文介绍芝加哥(1):Making Modern Chicago Part 1 Building a Boomtown
Making Modern Chicago | Part 1: Building a Boomtown Link: https://www.youtube.com/watch?vpNdX0Dm-J8Y&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index4 Summary Summary of Chicago’s History and Development Urban Planning and Growth Chicago, often r…...
【启明智显分享】低成本RISC-V工业级HMI方案推荐
伴随着工业4.0的迅猛发展,工业HMI以方便、快捷的特点逐渐成为工业的日常应用,成为备受追捧的全新多媒体交互设备。 什么是工业HMI?工业HMI是用于工业自动化系统中的人机交互界面,通常由触摸屏、按钮、指示灯、显示器等组成&#…...
深入探索STM32的SPI功能:W25Q64 Flash存储器全攻略
摘要 随着嵌入式系统对存储需求的增长,选择合适的存储设备变得尤为重要。W25Q64 Flash存储器以其8Mbit的存储容量和SPI接口的便捷性,成为STM32微控制器项目中的优选存储方案。本文将深入探索STM32的SPI功能,提供W25Q64 Flash存储器的全面集成…...
【SQL Server数据库】带函数查询和综合查询(1)
目录 1.统计年龄大于30岁的学生的人数。 2.统计数据结构有多少人80分或以上。 3.查询“0203”课程的最高分的学生的学号。 4.统计各系开设班级的数目(系名称、班级数目),并创建结果表。 5.选修了以“01”开头的课…...
使用WebService接口进行数据通信
使用WebService接口进行数据通信 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何使用WebService接口进行数据通信。WebService是一种基于Web…...
AI进阶指南第五课,大模型相关概念(知识库,微调)
虽然前面大概讲了一下大模型的一些基本概念,但是那些都比较偏向于大模型本身,但是我们使用的时候如果只靠大模型肯定是不行的。 就好比如果一个人只有一个脑子,其他什么部位也没有的话,那场面。(感觉现在网上的AI图片…...
【深度学习基础】`view` 和 `reshape` 的参数详解
目录 基本概念参数详解 示例view 和 reshape 在具体应用中的参数解释参数解释 更多示例高维张量示例非连续内存示例 总结 基本概念 view 和 reshape 都用于调整张量的形状,它们的参数是新的形状,每个维度的大小可以指定为具体的数值或者 -1。-1 表示这个…...
【笔记】Spring Cloud Gateway 实现 gRPC 代理
Spring Cloud Gateway 在 3.1.x 版本中增加了针对 gRPC 的网关代理功能支持,本片文章描述一下如何实现相关支持.本文主要基于 Spring Cloud Gateway 的 官方文档 进行一个实践练习。有兴趣的可以翻看官方文档。 由于 Grpc 是基于 HTTP2 协议进行传输的,因此 Srping …...
云顶之弈数据网站
摘要:随着云顶之弈游戏的广泛流行,玩家对于游戏数据的查询和最新资讯的获取需求呈现出显著增长的趋势。设计一款云顶之弈数据网站,为玩家提供便捷、高效的数据查询和资讯浏览服务,能满足玩家对于游戏数据的快速查询和实时资讯获取…...
Linux(Ubuntu)下源码开发整个流程完成版本(下载->编译->模拟器运行)
写这篇文章没别的意思, 年纪大了记性不好, 这次工作中下载,编译遇到了一些之前没遇到的问题,所以就所幸记录一下, 以便日后能快速查阅 好了, 正题开始 首先我们下载AOSP源代码开始 AOSP源代码下载 首先找到官网https://source.android.google.cn/ 进入后最上面点击获取源代…...
el-form表单实现校验
前端表单实现, rules 属性传入约定的验证规则,并将 form-Item 的 prop 属性设置为需要验证的特殊键值即可。 <el-form ref"ruleFormRef" :model"interviewForm" label-position"left" require-asterisk-position"…...
一台TrinityCore服务器客户端连接网速慢(未解决)
在FreeBSD开bhyve安装Ubuntu,然后安装了TrinityCore服务器,在只是经过一层NAT,两边都是局域网的情况下,连接速度竟然很慢,慢到600ms。 服务器安装见:尝试在FreeBSD 的jail、bhyve里安装TrinityCore-CSDN博…...
[系统运维|Xshell]宿主机无法连接上NAT网络下的虚拟机进行维护?主机ping不通NAT网络下的虚拟机,虚拟机ping的通主机!解决办法
遇到的问题:主机ping不通NAT网络下的虚拟机,虚拟机ping的通主机 服务器:Linux(虚拟机) 主机PC:Windows 虚拟机:vb,vm测试过没问题,vnc没测试不清楚 虚拟机网络࿱…...
C 语言实例 - 查找数组中最大的元素值
查找数组中最大的元素值。 实例 1 #include <stdio.h>int main() {int array[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};int loop, largest;largest array[0];for(loop 1; loop < 10; loop) {if( largest < array[loop] ) largest array[loop];}printf("最大…...
MySQL之可扩展性(七)
可扩展性 通过集群扩展 理想的扩展方案时单一逻辑数据库能够存储尽可能多的数据,处理尽可能多的查询,并如期望的那样增长。许多人的第一想法就是建立一个"集群"或者"网格"来无缝处理这些事情,这样应用就无须去做太多工…...
微服务框架中Nacos的个人学习心得
微服务框架需要学习的东西很多,基本上我把它分为了五个模块: 第一:微服务技术模块 分为三个常用小模块: 1.微服务治理: 注册发现 远程调用 配置管理 网关路由 2.微服务保护: 流量控制 系统保护 熔断降级 服…...
Unity Animator 运行时修改某个动画状态的播放速度
1.添加动画参数,选择需要动态修改速度的动画状态 2.在属性面板种设置速度倍速参数...
深度解读华为Limera:从舱内激光视觉融合看前融合技术的发展与演进
引言:一场由华为Limera引发的技术关注 2025年4月22日,华为在这场智能汽车技术的竞赛中投下了一枚“小巧”的重磅产品——Limera(Lidar+Camera)。这款产品并非简单地堆砌硬件,而是将激光雷达与摄像头深度集成,以小巧的体积安装在座舱内,却实现了惊人的性能:夜晚可识别3…...
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
目录 前言 一、PostGIS空间求解 1、相邻的求解 二、后台程序实现 1、数据查询的实现 2、API接口实现 三、WebGIS可视化实现 1、空间面展示 2、增加面标注 3、图例展示 4、与缅甸距离较近的区县信息 四、总结 前言 云南,这个位于中国西南边陲的省份&…...
!devnode 扩展显示设备树中节点的相关信息的一个例子中的CmResourceList和BootResourcesList和IoResList
!devnode 扩展显示设备树中节点的相关信息的一个例子中的CmResourceList和BootResourcesList和IoResListCmResourceListBootResourcesList IoResList!devnode 扩展显示设备树中节点的相关信息。 dbgcmd!devnode Address [Flags] [Service] !devnode 1 !devnode 2参数地址 指定…...
90%人踩的YOLO训练坑:数据增强配置错误导致mAP暴跌40%!附2026最新避坑指南
前言 “为什么我的模型在训练集上 loss 降得飞快,验证集 mAP 却一动不动甚至倒跌?” “明明换了更大的数据集,为什么效果反而不如小数据集?” “抄了大神的 yaml 配置,为什么我的模型训练出来全是假阳性?”…...
基于强化学习的DeepChat对话策略优化
基于强化学习的DeepChat对话策略优化 1. 引言 电商客服每天要处理成千上万的客户咨询,传统的人工客服成本高、效率低,而简单的聊天机器人又经常答非所问,让客户体验大打折扣。现在很多企业都在用AI客服,但效果参差不齐——有的机…...
Java Web MVC自习室管理和预约系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
摘要 随着高校教育规模的不断扩大,自习室资源的管理和分配问题日益突出。传统的人工管理方式效率低下,容易出现资源浪费和分配不均的情况。尤其是在考试周或毕业季,学生对于自习室座位的需求激增,如何高效、公平地分配座位资源成为…...
突破VK视频下载限制的终极解决方案:VK-Video-Downloader完全指南
突破VK视频下载限制的终极解决方案:VK-Video-Downloader完全指南 【免费下载链接】VK-Video-Downloader Скачивайте видео с сайта ВКонтакте в желаемом качестве 项目地址: https://gitcode.com/gh_mirrors/vk/…...
M3U8视频下载技术全解析:从误区破除到未来演进
M3U8视频下载技术全解析:从误区破除到未来演进 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 开篇:认知重构——打破M3U8下载的三大迷思 在数字内容获取…...
Tftpd64网络服务工具实战指南:从基础部署到企业级应用全攻略
Tftpd64网络服务工具实战指南:从基础部署到企业级应用全攻略 【免费下载链接】tftpd64 The working repository of the famous TFTP server. 项目地址: https://gitcode.com/gh_mirrors/tf/tftpd64 Tftpd64是一款集成TFTP(Trivial File Transfer …...
log4cpp从源码到实战:Ubuntu环境下的安装与配置指南
1. 为什么选择log4cpp? 在开发C项目时,日志系统就像项目的"黑匣子",记录着程序运行的每一个关键时刻。我经历过太多深夜调试的煎熬,直到遇到log4cpp才真正体会到什么叫做"日志自由"。这个轻量级的C日志库不仅…...
