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);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPP入门:日期类的构建

目录 1.日期类的成员 2.日期类的成员函数 2.1构造和析构函数 2.2检查日期合法 2.3日期的打印 2.4操作符重载 2.4.1小于号 2.4.2等于号 2.4.3小于等于号 2.4.4大于号 2.4.5大于等于号 2.4.6不等号 2.4.7加等的实现 2.4.8加的实现 2.4.9减去一个天数的减等实现 2.4.10…

使用瀚高数据库开发管理工具进行数据的备份与恢复---国产瀚高数据库工作笔记008

使用瀚高数据库,备份 恢复数据 然后找到对应的目录 其实就是hgdbdeveloper,瀚高的数据库开发管理工具 对应的包中有个dbclient 这个目录,选中这个目录以后,就可以了,然后 在对应的数据库,比如 data_middle 中,选中 某个模式,比如bigdata_huiju 然后右键进行,点击 恢复,然…

Verilog开源项目——百兆以太网交换机(五)TCAM单元设计

Verilog开源项目——百兆以太网交换机&#xff08;五&#xff09;TCAM单元设计 &#x1f508;声明&#xff1a;未经作者允许&#xff0c;禁止转载 &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;全新原创以太网交换机项目&#xff0c;Blog内容将聚焦整体架…

核心实验:基于Web前端的性能测试分析!

实验简介 本实验主要利用IE和Chrome的F12开发人员工具结合Web前端测试分析相关知识&#xff0c;对常见网站进行基于前端的性能测试分析&#xff0c;本实验将不会使用到测试开发相关技术&#xff0c;而是纯粹意义上的手工测试&#xff0c;但却是很容易找到系统前端性能及设计问…

C++字体库开发

建议根据字体需求&#xff0c;多个组合使用。高度定制可基于freeTypeharfbuzz基础库完成。 GitHub - GNOME/pango: Read-only mirror of https://gitlab.gnome.org/GNOME/pango GitHub - googlefonts/fontview: Demo app that displays fonts with a free/libre/open-source …

实用软件分享-----一款免费的投屏软件(支持手机投屏到电脑)Aiseesoft Phone Mirror 2.2.36 x64

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

天猫商品列表数据接口(Tmall.item_search)

天猫平台商品列表数据接口&#xff08;taobao.item_search&#xff09;是天猫开放平台提供的一个API接口&#xff0c;用于获取天猫平台上的商品列表数据。通过该接口&#xff0c;用户可以获取到商品的名称、价格、销量、评价等信息。下面将具体介绍这个接口的各个方面&#xff…

H616连接摄像头

&#xff08;1&#xff09;首先将USB摄像头连接到OrangePi开发板的USB接口 &#xff08;2&#xff09;通过lsmod命令查看是否加载了uvcvideo模块 lsmod | grep video &#xff08;3&#xff09;通过 v4l2-ctl 命令可以看到 USB 摄像头的设备节点信息为/dev/video0 sudo apt u…

剖析DeFi交易产品之UniswapV4:创建池子

本文首发于公众号&#xff1a;Keegan小钢 创建池子的底层函数是 PoolManager 合约的 initialize 函数&#xff0c;其代码实现并不复杂&#xff0c;如下所示&#xff1a; function initialize(PoolKey memory key, uint160 sqrtPriceX96, bytes calldata hookData)externalover…

Redis---保证主从节点一致性问题 +与数据库数据保持一致性问题

保证主从节点一致性问题 Redis的同步方式默认是异步的&#xff0c;这种异步的同步方式导致了主从之间的数据存在一定的延迟&#xff0c;因此Redis默认是弱一致性的。 解决&#xff1a; 1.使用Redisson这样的工具&#xff0c;它提供了分布式锁的实现&#xff0c;确保在分布式环…

【C语言】使用C语言编写并使用gcc编译动态链接库

【C语言】使用C 语言编写并使用 gcc 编译动态链接库 1.背景2.使用C编写代码3.使用gcc编译代码1.背景 在windows下开发很多程序接口被封装到动态链接库供其它开发者使用。 本博客使用C语言编写并使用gcc 编译 一个动态链接库文件FpdSys.dll; 然后使用C/C++/C#/Python去调用动态…

代码生成器使用指南,JeecgBoot低代码平台

JeecgBoot 提供强大的代码生成器&#xff0c;让前后端代码一键生成&#xff0c;实现低代码开发。支持单表、树列表、一对多、一对一等数据模型&#xff0c;增删改查功能一键生成&#xff0c;菜单配置直接使用。 同时提供强大模板机制&#xff0c;支持自定义模板&#xff0c;目…

[单master节点k8s部署]15.安全机制

用户访问集群需要认证、授权、准入三个步骤。apiserver是整个集群访问控制的唯一入口。 认证 认证是对用户的身份认证&#xff0c;通常包括用户名密码认证&#xff0c;但是也包括对service account的认证。 限制不同用户访问集群 生成ssl密钥 在/etc/kubernetes/pki/ 目录…

Python 基础 (标准库):heapq (堆)

1. 官方文档 heapq --- 堆队列算法 — Python 3.12.4 文档 2. 相关概念 堆 heap 是一种具体的数据结构&#xff08;concrete data structures&#xff09;&#xff1b;优先级队列 priority queue 是一种抽象的数据结构&#xff08;abstract data structures&#xff09;&…

在非 antd pro 项目中使用 umi OpenAPI

大家好&#xff0c;我是松柏。自从跟着鱼皮哥使用了ant design pro中的OpenAPI插件之后&#xff0c;我已经无法忍受自己写请求后端接口的方法了&#xff0c;所以这篇文章记录一下如何在非ant design pro项目中使用OpenAPI。 安装依赖 首先我们需要安装包umijs/openapi&#x…

上交举办“大模型奥林匹克竞赛”,GPT-4o仅得39分

大模型的奥林匹克竞赛来了&#xff01; 最近&#xff0c;上交构建了一个全面、极具挑战性的奥赛级别的基准——OlympicArena&#xff0c;从来自62个不同奥林匹克竞赛中筛选出11,163个问题&#xff0c;涵盖数学、物理、化学、生物、地理、天文学和计算机科学等七个学科&#xf…

[22] Opencv_CUDA应用之 使用背景相减法进行对象跟踪

Opencv_CUDA应用之 使用背景相减法进行对象跟踪 背景相减法是在一系列视频帧中将前景对象从背景中分离出来的过程&#xff0c;它广泛应用于对象检测和跟踪应用中去除背景 背景相减法分四步进行&#xff1a;图像预处理 -> 背景建模 -> 检测前景 -> 数据验证 预处理去除…

博客搬家前台申请功能下线通知

尊敬的用户们&#xff1a; 您好&#xff01; 感谢您一直以来对我们博客平台的关注与支持。为了更好地优化我们的服务质量和用户体验&#xff0c;经过慎重考虑&#xff0c;我们决定将于近期对博客搬家前台申请功能进行下线处理。在此&#xff0c;我们向广大用户表示诚挚的歉意…

仿论坛项目--第一部分相关习题

1.关于IOC注解&#xff0c;说法正确的是 A.autowired用于注入bean,该注解只能写在成员变量的前面 B.Qualifier用于声明bean的名称&#xff0c;该注解只能引用bean的自定义名称 C.Bean用于装配第三方的Bean&#xff0c;不能装配自定义的bean D.Configuration用于声明配置类&…

AD9026芯片开发实录6-example code

官方发布的软件包中&#xff0c;带了一份example code&#xff0c;用于向客户展示API的调用方法以及基于官方的验证版ADRV902X最简单的bring up的流程。 该 example 位于软件包的路径下&#xff1a;“\Adi.Adrv9025.Api\src\c_src\app\example\”。 代码组成&#xff1a; initd…