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.在属性面板种设置速度倍速参数...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
