首页 > 编程语言 >【阿里云】通过OpenAPI获取Token(C#)

【阿里云】通过OpenAPI获取Token(C#)

时间:2024-07-29 14:52:10浏览次数:12  
标签:string C# Add OpenAPI Token static var queryParamsMap Append

使用 C# 实现 https://help.aliyun.com/zh/isi/getting-started/use-http-or-https-to-obtain-an-access-token

public static class TokenHelper
{
    public static async Task<string> GetAccessTokenAsync(string accessKeyId, string accessKeySecret)
    {
        var queryParamsMap = new Dictionary<string, string>();

        queryParamsMap.Add("AccessKeyId", accessKeyId);
        queryParamsMap.Add("Action", "CreateToken");
        queryParamsMap.Add("Version", "2019-02-28");
        queryParamsMap.Add("Timestamp", GetISO8601Time());
        queryParamsMap.Add("Format", "JSON");
        queryParamsMap.Add("RegionId", "cn-shanghai");
        queryParamsMap.Add("SignatureMethod", "HMAC-SHA1");
        queryParamsMap.Add("SignatureVersion", "1.0");
        queryParamsMap.Add("SignatureNonce", GetUniqueNonce());

        string queryString = CanonicalizedQuery(queryParamsMap);

        string method = "GET";
        string urlPath = "/";
        string stringToSign = CreateStringToSign(method, urlPath, queryString);

        string signature = Sign(stringToSign, accessKeySecret + "&");

        string queryStringWithSign = "Signature=" + signature + "&" + queryString;

        var url = "http://nls-meta.cn-shanghai.aliyuncs.com/?" + queryStringWithSign;

        var client = new HttpClient();
        var response = await client.GetAsync(url);
        var json = await response.Content.ReadAsStringAsync();
        response.Dispose();
        client.Dispose();

        return json;
    }

    private static string GetISO8601Time()
    {
        return DateTimeOffset.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
    }

    private static string GetUniqueNonce()
    {
        return Guid.NewGuid().ToString();
    }

    private static string PercentEncode(string value)
    {
        return Uri.EscapeDataString(value);
    }

    private static string CanonicalizedQuery(Dictionary<string, string> queryParamsMap)
    {
        var sortedKeys = queryParamsMap.Keys.Order();
        var canonicalizedQueryString = new StringBuilder();
        foreach (var key in sortedKeys)
        {
            canonicalizedQueryString
                .Append('&')
                .Append(PercentEncode(key))
                .Append('=')
                .Append(PercentEncode(queryParamsMap[key]));
        }
        return canonicalizedQueryString.ToString().Substring(1);
    }

    private static string CreateStringToSign(string method, string urlPath, string queryString)
    {
        var strBuilderSign = new StringBuilder();
        strBuilderSign.Append(method);
        strBuilderSign.Append('&');
        strBuilderSign.Append(PercentEncode(urlPath));
        strBuilderSign.Append('&');
        strBuilderSign.Append(PercentEncode(queryString));
        return strBuilderSign.ToString();
    }

    private static string Sign(string stringToSign, string accessKeySecret)
    {
        var key = Encoding.UTF8.GetBytes(accessKeySecret);
        var source = Encoding.UTF8.GetBytes(stringToSign);
        var signData = HMACSHA1.HashData(key, source);
        var signBase64 = Convert.ToBase64String(signData);
        var signUrlEncode = PercentEncode(signBase64);
        return signUrlEncode;
    }
}

 

标签:string,C#,Add,OpenAPI,Token,static,var,queryParamsMap,Append
From: https://www.cnblogs.com/crsky/p/18330079

相关文章

  • 医学成像控制卡:268-基于FMC接口的DSP TMS320C6657子卡模块
    基于FMC接口的DSPTMS320C6657子卡模块一、概述       FMC连接器是一种高速多pin的互连器件,广泛应用于板卡对接的设备中,特别是在xilinx公司的所有开发板中都使用。该DSP子卡模块以TI强大性能DSPTMS320C6657作为主芯片,专门针对xilinx开发板设计的标准板卡,用于关键任务,医......
  • CF30E Tricky and Clever Password 题解
    考虑先贪心中间的回文串\(b\),因为这即使影响了两边的字符串,也不会改变最终的总串长。所以先使用manacher跑出来每个位置的最长回文半径。在考虑怎样找出最长的\(a\)和\(a'\)。可以二分答案,设此时答案为\(k\),找出的\(b\)串为\(s[l\dotsr]\),那么其合法的条件就是存在\(......
  • pymongo版本更新错误DatetimeConversion
    由于我使用的是pymongo版本3.6.0,现在更新到版本4.6.3,在此更新之后,我可以执行构建并开始运行。但在单元测试中,我的错误为“ImportError:无法从'bson.code_option'(~/bmstmp/dockcont1/configs/main/pybuild/x86_64-v21/Debug/bson/codec_options.py)导入名称'DatetimeC......
  • [Typescript] Restrict available operations on values using value objects
    ValueObjectsareanotherpatterninDomain-drivenDesignthatprovidemorestructurearoundwhatyoucanandcannotdowithatype.InTypeScriptwecreateValueObjectswithclassesthatwilldefinewhatoperationscanbeperformedtothevalueonthec......
  • 怎么在虚拟机跑PCDN项目教程
    Windows启用Hyper-V​Hyper-V是微软推出的免费的虚拟化服务,从Windows8开始,其企业版.专业版.教育版系统都可以免费开启Hyper-V服务。注意:家庭版系统不支持Hyper-V,需要升级为专业版。注意:如果已经开启过Hyper-V,请跳过本步骤。下边我们以Win10为例,开启Hyper-V服务。​方法......
  • setpci 使用方法
    以设置PASIDcapabilityenable为例,假设通过lspci-s0d:00.0-vvvv显示如下..........在键入命令lspci-s0d:00.0-xxxx显示如下...........根据协议如下:那么可以对照如下因此,我们可以这样设置:setpci-s2d:00.020a.b=07设置完成后,lspci看一下结果,如下:就成功了......
  • CSV大文件拆分技巧:如何快速分割大数据集
    你是否曾经面对一个庞大的CSV文件,不知道如何高效地进行拆分?大数据集的处理是每个数据分析师都会遇到的挑战。今天,我将分享几种有效的CSV大文件拆分技巧,帮助你轻松应对这一难题。在这篇文章中,我将介绍几种不同的方法,包括使用高性能工具、Excel、WPS,以及编程方式。无论你是数据......
  • C语言基础算法
    C语言基础算法目录C语言基础算法1、阶乘递归实现循环实现2、排序冒泡排序选择排序3、斐波那契数列4、ASCII码的使用1、阶乘递归实现#include<stdio.h>//递归函数计算阶乘intfactorial(intn){if(n==0||n==1)return1;elsereturnn......
  • vue el-form中label使用类似小程序text标签 space的功能
    在Vue中,没有直接类似于微信小程序中<text>标签的space属性,该属性用于控制文本节点之间的空格处理方式。然而,Vue和Web开发中,文本节点之间的空格处理通常是通过HTML和CSS来控制的,而不是像小程序那样通过组件属性来控制。在HTML中,连续的空格字符通常会被浏览器合并为一个空格......
  • Unity GameObject学习笔记
    GameObject成员变量GameObject静态方法//准备用来克隆的对象//1.直接是场景上的某个对象//2.可以是一个预制体对象publicGameObjectMyobj;#region知识点二GameObject中的静态方法创建自带几何体只要得到了一个GameObject对象我就......