当前位置: 首页 > news >正文

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 方法生成带有密钥的哈希值&#xff1a; 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 时&#xff0c;mongodb 报如下错误&#xff1a; MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo 这是因为 mongo 没有解析出来&#xff0c;在 hosts 文件中添加如下信息&#xff1a; 127.0.0.1 mongo 重新运行 FastGPT 即可。 参考链接&#xff…...

用英文介绍芝加哥(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的迅猛发展&#xff0c;工业HMI以方便、快捷的特点逐渐成为工业的日常应用&#xff0c;成为备受追捧的全新多媒体交互设备。 什么是工业HMI&#xff1f;工业HMI是用于工业自动化系统中的人机交互界面&#xff0c;通常由触摸屏、按钮、指示灯、显示器等组成&#…...

深入探索STM32的SPI功能:W25Q64 Flash存储器全攻略

摘要 随着嵌入式系统对存储需求的增长&#xff0c;选择合适的存储设备变得尤为重要。W25Q64 Flash存储器以其8Mbit的存储容量和SPI接口的便捷性&#xff0c;成为STM32微控制器项目中的优选存储方案。本文将深入探索STM32的SPI功能&#xff0c;提供W25Q64 Flash存储器的全面集成…...

【SQL Server数据库】带函数查询和综合查询(1)

目录 1&#xff0e;统计年龄大于30岁的学生的人数。 2&#xff0e;统计数据结构有多少人80分或以上。 3.查询“0203”课程的最高分的学生的学号。 4&#xff0e;统计各系开设班级的数目(系名称、班级数目)&#xff0c;并创建结果表。 5&#xff0e;选修了以“01”开头的课…...

使用WebService接口进行数据通信

使用WebService接口进行数据通信 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何使用WebService接口进行数据通信。WebService是一种基于Web…...

AI进阶指南第五课,大模型相关概念(知识库,微调)

虽然前面大概讲了一下大模型的一些基本概念&#xff0c;但是那些都比较偏向于大模型本身&#xff0c;但是我们使用的时候如果只靠大模型肯定是不行的。 就好比如果一个人只有一个脑子&#xff0c;其他什么部位也没有的话&#xff0c;那场面。&#xff08;感觉现在网上的AI图片…...

【深度学习基础】`view` 和 `reshape` 的参数详解

目录 基本概念参数详解 示例view 和 reshape 在具体应用中的参数解释参数解释 更多示例高维张量示例非连续内存示例 总结 基本概念 view 和 reshape 都用于调整张量的形状&#xff0c;它们的参数是新的形状&#xff0c;每个维度的大小可以指定为具体的数值或者 -1。-1 表示这个…...

【笔记】Spring Cloud Gateway 实现 gRPC 代理

Spring Cloud Gateway 在 3.1.x 版本中增加了针对 gRPC 的网关代理功能支持,本片文章描述一下如何实现相关支持.本文主要基于 Spring Cloud Gateway 的 官方文档 进行一个实践练习。有兴趣的可以翻看官方文档。 由于 Grpc 是基于 HTTP2 协议进行传输的&#xff0c;因此 Srping …...

云顶之弈数据网站

摘要&#xff1a;随着云顶之弈游戏的广泛流行&#xff0c;玩家对于游戏数据的查询和最新资讯的获取需求呈现出显著增长的趋势。设计一款云顶之弈数据网站&#xff0c;为玩家提供便捷、高效的数据查询和资讯浏览服务&#xff0c;能满足玩家对于游戏数据的快速查询和实时资讯获取…...

Linux(Ubuntu)下源码开发整个流程完成版本(下载->编译->模拟器运行)

写这篇文章没别的意思, 年纪大了记性不好, 这次工作中下载,编译遇到了一些之前没遇到的问题,所以就所幸记录一下, 以便日后能快速查阅 好了, 正题开始 首先我们下载AOSP源代码开始 AOSP源代码下载 首先找到官网https://source.android.google.cn/ 进入后最上面点击获取源代…...

el-form表单实现校验

前端表单实现&#xff0c; rules 属性传入约定的验证规则&#xff0c;并将 form-Item 的 prop 属性设置为需要验证的特殊键值即可。 <el-form ref"ruleFormRef" :model"interviewForm" label-position"left" require-asterisk-position"…...

一台TrinityCore服务器客户端连接网速慢(未解决)

在FreeBSD开bhyve安装Ubuntu&#xff0c;然后安装了TrinityCore服务器&#xff0c;在只是经过一层NAT&#xff0c;两边都是局域网的情况下&#xff0c;连接速度竟然很慢&#xff0c;慢到600ms。 服务器安装见&#xff1a;尝试在FreeBSD 的jail、bhyve里安装TrinityCore-CSDN博…...

[系统运维|Xshell]宿主机无法连接上NAT网络下的虚拟机进行维护?主机ping不通NAT网络下的虚拟机,虚拟机ping的通主机!解决办法

遇到的问题&#xff1a;主机ping不通NAT网络下的虚拟机&#xff0c;虚拟机ping的通主机 服务器&#xff1a;Linux&#xff08;虚拟机&#xff09; 主机PC&#xff1a;Windows 虚拟机&#xff1a;vb&#xff0c;vm测试过没问题&#xff0c;vnc没测试不清楚 虚拟机网络&#xff1…...

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之可扩展性(七)

可扩展性 通过集群扩展 理想的扩展方案时单一逻辑数据库能够存储尽可能多的数据&#xff0c;处理尽可能多的查询&#xff0c;并如期望的那样增长。许多人的第一想法就是建立一个"集群"或者"网格"来无缝处理这些事情&#xff0c;这样应用就无须去做太多工…...

微服务框架中Nacos的个人学习心得

微服务框架需要学习的东西很多&#xff0c;基本上我把它分为了五个模块&#xff1a; 第一&#xff1a;微服务技术模块 分为三个常用小模块&#xff1a; 1.微服务治理&#xff1a; 注册发现 远程调用 配置管理 网关路由 2.微服务保护&#xff1a; 流量控制 系统保护 熔断降级 服…...

Unity Animator 运行时修改某个动画状态的播放速度

1.添加动画参数&#xff0c;选择需要动态修改速度的动画状态 2.在属性面板种设置速度倍速参数...

简易CPU设计入门:算术逻辑单元(五)

专栏导航 上一篇&#xff1a;简易CPU设计入门&#xff1a;算术逻辑单元&#xff08;四&#xff09; 专栏目录 下一篇&#xff1a;简易CPU设计入门&#xff1a;算术逻辑单元&#xff08;六&#xff09; 项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&am…...

基于LangChain的RAG与Agent智能体开发 - 持久化会话记忆功能实现(RunnableWithMessageHistory+RedisChatMessageHistory)

大家好&#xff0c;我是小锋老师&#xff0c;最近更新《2027版 基于LangChain的RAG与Agent智能体 开发视频教程》专辑&#xff0c;感谢大家支持。本课程主要介绍和讲解RAG&#xff0c;LangChain简介&#xff0c;接入通义千万大模型 &#xff0c;Ollama简介以及安装和使…...

MelonLoader终极指南:3分钟掌握Unity游戏模组加载器完整使用技巧

MelonLoader终极指南&#xff1a;3分钟掌握Unity游戏模组加载器完整使用技巧 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader Me…...

统信UOS 1060e内网离线安装Docker保姆级教程(附CentOS 8 RPM包下载)

统信UOS 1060e内网离线安装Docker全流程实战指南 在企业级IT基础设施中&#xff0c;内网环境下的软件部署一直是运维工程师面临的特殊挑战。当服务器完全隔离于互联网时&#xff0c;每一个依赖包、每一条配置指令都可能成为阻碍系统正常运行的潜在障碍。本文将深入探讨在统信UO…...

如何去选择品质优秀的段码屏厂家

在现代电子产品中&#xff0c;LCD液晶段码屏的应用越来越广泛。选择一家优质的厂家不仅能保证产品质量&#xff0c;还能提供高效的服务。本文将为您推荐十家在LCD液晶段码屏领域表现突出的厂家&#xff0c;帮助您做出明智的选择。1. 杭州斡能电子有限公司杭州斡能电子有限公司&…...

《QGIS快速入门与应用基础》240:指北针旋转与大小调整

作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...

OpenClaw定时任务管理:Qwen3.5-4B-Claude模型驱动智能提醒系统

OpenClaw定时任务管理&#xff1a;Qwen3.5-4B-Claude模型驱动智能提醒系统 1. 为什么需要AI驱动的定时任务系统 上个月我连续错过了三个重要会议&#xff0c;直到同事发消息询问"人到哪了"才猛然惊醒。这种尴尬促使我开始寻找解决方案——传统日历提醒太被动&#…...

机器学习期末考突击指南:从线性回归到SVM的实战解题技巧

机器学习期末考突击指南&#xff1a;从线性回归到SVM的实战解题技巧 期末考试临近&#xff0c;面对机器学习课程中纷繁复杂的算法和公式&#xff0c;许多同学感到无从下手。本文将从实际考题出发&#xff0c;手把手带你攻克线性回归、朴素贝叶斯和SVM三大核心考点&#xff0c;不…...

Windows下用Rclone挂载WebDAV的完整指南:从安装到开机自启(含常见问题解决)

Windows系统下Rclone挂载WebDAV全流程实战手册 引言&#xff1a;为什么选择Rclone挂载WebDAV&#xff1f; 在日常办公和团队协作中&#xff0c;我们经常需要访问云端存储的文件。WebDAV作为一种基于HTTP协议的文件管理标准&#xff0c;被Nextcloud、OwnCloud等主流网盘广泛支…...

音频可视化工具:Lano Visualizer打造沉浸式桌面音乐体验

音频可视化工具&#xff1a;Lano Visualizer打造沉浸式桌面音乐体验 【免费下载链接】Lano-Visualizer A simple but highly configurable visualizer with rounded bars. 项目地址: https://gitcode.com/gh_mirrors/la/Lano-Visualizer 在数字生活中&#xff0c;音乐不…...