华为云Api调用怎么生成Authorization鉴权信息,StringToSign拼接流程

请求示例 

Authorization

为了安全,华为云的 Api 调用都是需要在请求的 Header 中携带 Authorization 鉴权的,这个鉴权15分钟内有效,超过15分钟就不能用了,而且是需要调用方自己手动拼接的。

Authorization的格式为

OBS 用户AK:手动生成的Signature

Signature生成

Signature生成流程:

 参考文档:Header中携带签名_对象存储服务 OBS

Signature生成代码

package com.fdw.algorithm.HWCloud;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;public class SignDemo {private static final String SIGN_SEP = "\n";private static final String OBS_PREFIX = "x-obs-";private static final String DEFAULT_ENCODING = "UTF-8";private static final List<String> SUB_RESOURCES = Collections.unmodifiableList(Arrays.asList("CDNNotifyConfiguration", "acl", "append", "attname", "backtosource", "cors", "customdomain", "delete","deletebucket", "directcoldaccess", "encryption", "inventory", "length", "lifecycle", "location", "logging","metadata", "mirrorBackToSource", "modify", "name", "notification", "obscompresspolicy",  "orchestration", "partNumber", "policy", "position", "quota","rename", "replication", "response-cache-control", "response-content-disposition","response-content-encoding", "response-content-language", "response-content-type", "response-expires","restore", "storageClass", "storagePolicy", "storageinfo", "tagging", "torrent", "truncate","uploadId", "uploads", "versionId", "versioning", "versions", "website", "x-image-process","x-image-save-bucket", "x-image-save-object", "x-obs-security-token", "object-lock", "retention"));private String ak;private String sk;// 对字符串进行UTF8编码public String urlEncode(String input) throws UnsupportedEncodingException {return URLEncoder.encode(input, DEFAULT_ENCODING).replaceAll("%7E", "~") //for browser.replaceAll("%2F", "/").replaceAll("%20", "+");}private String join(List<?> items, String delimiter) {StringBuilder sb = new StringBuilder();for (int i = 0; i < items.size(); i++) {String item = items.get(i).toString();sb.append(item);if (i < items.size() - 1) {sb.append(delimiter);}}return sb.toString();}private boolean isValid(String input) {return input != null && !input.equals("");}// 使用访问密钥SK计算HmacSHA1值public String hmacSha1(String input) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {SecretKeySpec signingKey = new SecretKeySpec(this.sk.getBytes(DEFAULT_ENCODING), "HmacSHA1");// 获取Mac实例,并通过getInstance方法指定使用HMAC-SHA1算法Mac mac = Mac.getInstance("HmacSHA1");// 使用访问密钥SK初始化Mac对象mac.init(signingKey);return Base64.getEncoder().encodeToString(mac.doFinal(input.getBytes(DEFAULT_ENCODING)));}// 构造StringToSignprivate String stringToSign(String httpMethod, Map<String, String[]> headers, Map<String, String> queries,String bucketName, String objectName) throws Exception{String contentMd5 = "";String contentType = "";String date = "";TreeMap<String, String> canonicalizedHeaders = new TreeMap<String, String>();String key;List<String> temp = new ArrayList<String>();for(Map.Entry<String, String[]> entry : headers.entrySet()) {key = entry.getKey();if(key == null || entry.getValue() == null || entry.getValue().length == 0) {continue;}key = key.trim().toLowerCase(Locale.ENGLISH);if(key.equals("content-md5")) {contentMd5 = entry.getValue()[0];continue;}if(key.equals("content-type")) {contentType = entry.getValue()[0];continue;}if(key.equals("date")) {date = entry.getValue()[0];continue;}if(key.startsWith(OBS_PREFIX)) {				for(String value : entry.getValue()) {if(value != null) {temp.add(value.trim());}}canonicalizedHeaders.put(key, this.join(temp, ","));temp.clear();}}// 如果header头域中包含x-obs-date,Date参数置空if(canonicalizedHeaders.containsKey("x-obs-date")) {date = "";}	// 构造StringToSign,拼接HTTP-Verb、Content-MD5、Content-Type、DateStringBuilder stringToSign = new StringBuilder();stringToSign.append(httpMethod).append(SIGN_SEP).append(contentMd5).append(SIGN_SEP).append(contentType).append(SIGN_SEP).append(date).append(SIGN_SEP);// 构造StringToSign,拼接CanonicalizedHeadersfor(Map.Entry<String, String> entry : canonicalizedHeaders.entrySet()) {stringToSign.append(entry.getKey()).append(":").append(entry.getValue()).append(SIGN_SEP);}// 构造StringToSign,拼接CanonicalizedResourcestringToSign.append("/");if(this.isValid(bucketName)) {stringToSign.append(bucketName).append("/");if(this.isValid(objectName)) {stringToSign.append(this.urlEncode(objectName));}}TreeMap<String, String> canonicalizedResource = new TreeMap<String, String>();for(Map.Entry<String, String> entry : queries.entrySet()) {key = entry.getKey();if(key == null) {continue;}if(SUB_RESOURCES.contains(key)) {canonicalizedResource.put(key, entry.getValue());}}if(canonicalizedResource.size() > 0) {stringToSign.append("?");for(Map.Entry<String, String> entry : canonicalizedResource.entrySet()) {stringToSign.append(entry.getKey());if(this.isValid(entry.getValue())) {stringToSign.append("=").append(entry.getValue());}stringToSign.append("&");}stringToSign.deleteCharAt(stringToSign.length()-1);}// System.out.println(String.format("StringToSign:%s%s", SIGN_SEP, stringToSign.toString()));return stringToSign.toString();}public String headerSignature(String httpMethod, Map<String, String[]> headers, Map<String, String> queries, String bucketName, String objectName) throws Exception {// 构造stringToSignString stringToSign = this.stringToSign(httpMethod, headers, queries, bucketName, objectName);System.out.println("stringToSign: "+stringToSign);// 计算签名return String.format("OBS %s:%s", this.ak, this.hmacSha1(stringToSign));}public static void main(String[] args) throws Exception {SignDemo demo = new SignDemo();/* 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。*///demo.ak = System.getenv("HUAWEICLOUD_SDK_AK");//demo.sk = System.getenv("HUAWEICLOUD_SDK_SK");//最好用上面的方法赋值,这里只是简化操作demo.ak = "ZI6KNMNGWZUWMJV5WMKW";demo.sk = "hIAb8jwgPEHTYknEMKql6DRqGZMLxRY66cHzd8D2";String bucketName = "bucket-test";String objectName = "hello.jpg";Map<String, String[]> headers = new HashMap<String, String[]>();headers.put("date", new String[] {"Wed, 14 Aug 2024 07:20:28 GMT"});//headers.put("x-obs-acl", new String[] {"public-read"});//headers.put("x-obs-meta-key1", new String[] {"value1"});//headers.put("x-obs-meta-key2", new String[] {"value2", "value3"});Map<String, String> queries = new HashMap<String, String>();//queries.put("acl", null);//计算Header中携带的签名	System.out.println(demo.headerSignature("GET", headers, queries, null, null));}}

注意

代码中的 date 是手动填写的时间,必须为RFC 1123格式的GMT时间(和北京时间差了8个小时),与系统当前时间差不能超过15分钟。

 与请求头中的时间也要保持一致,分秒不差!!!

演示成果

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

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

相关文章

Linux系统移植——开发板烧写

目录&#xff1a; 目录&#xff1a; 一、什么是EMMC分区&#xff1f; 1.1 eMMC分区 1.2 分区的管理 二、相关命令介绍&#xff1a; 2.1 mmc 2.1.1 主要功能 2.1.2 示例用法 2.2 fdisk 2.2.1 基本功能 2.2.2 交互模式常用命令 2.2.3 注意事项 三、U-BOOT烧写 3.1 mmc命令 3.2 f…

【Linux入门】Linux环境搭建

目录 前言 一、发行版本 二、搭建Linux环境 1.Linux环境搭建方式 2.虚拟机安装Ubuntu 22.02.4 1&#xff09;安装VMWare 2&#xff09;下载镜像源 3&#xff09;添加虚拟机 4&#xff09;换源 5&#xff09;安装VM Tools 6)添加快照 总结 前言 Linux是一款自由和开放…

JAVA集中学习第五周学习记录(二)

系列文章目录 第一章 JAVA集中学习第一周学习记录(一) 第二章 JAVA集中学习第一周项目实践 第三章 JAVA集中学习第一周学习记录(二) 第四章 JAVA集中学习第一周课后习题 第五章 JAVA集中学习第二周学习记录(一) 第六章 JAVA集中学习第二周项目实践 第七章 JAVA集中学习第二周学…

RCE远程命令执行

命令执行的常用函数 system()&#xff1a;能将字符串作为系统命令执行&#xff0c;且返回命令执行结果。 #system(string $command, int &$result_code null): string|false system(whoami); exec()&#xff1a;能将字符串作为系统命令执行&#xff0c;但是只返回执行结果…

MySQL 的 InnoDB 缓冲池里有什么?--InnoDB存储梳理(二)

文章目录 缓冲池的配置介绍一张表 INNODB_BUFFER_POOL_PAGES字段解释 缓冲池的配置 以下配置的意思&#xff0c;缓冲池在内存中的大小为20M&#xff1b;只有1个缓冲池实例&#xff1b;每一块的大小&#xff0c;插入缓冲占的百分比 # InnoDB 缓存池配置 innodb_buffer_pool_si…

Python之循环语句

这是《Python入门经典以解决计算问题为导向的Python编程实践》中58-65的内容&#xff0c;主要将了while循环语句和for循环语句。 循环 一、while循环语句语法&#xff1a;工作原理&#xff1a;案例解读要点 二、for循环语句语法工作原理、案例&#xff1a;寻找完全数 三、whil…

学习记录——day30 网络编程 端口号port 套接字socket TCP实现网络通信

目录 一、端口号 port 二、套接字 socket 1、原理 2、socket函数介绍 三、TCP实现网络通信 1、原理 2、TCP通信原理图 3、TCP相关函数 1&#xff09;bind 绑定 2&#xff09;listen 监听 3&#xff09;accept 接收连接请求 4&#xff09;recv 接收 5&#xff09;sen…

Ubuntu系统中安装ffmpeg工具(详细图文教程)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

RAG:系统评估,以RAGAS为例

面试的时候经常会问到&#xff0c;模型和系统是怎么评估的&#xff0c;尤其是RAG&#xff0c;这么多组件&#xff0c;还有端到端&#xff0c;每部分有哪些指标评估&#xff0c;怎么实现的。今天整理下 目前最通用的是RAGAS框架&#xff0c;已经在langchain集成了。在看它之前&…

Java面试--设计模式

设计模式 目录 设计模式1.单例模式&#xff1f;2.代理模式&#xff1f;3.策略模式&#xff1f;4.工厂模式&#xff1f; 1.单例模式&#xff1f; 单例模式是Java的一种设计思想&#xff0c;用此模式下&#xff0c;某个对象在jvm只允许有一个实例&#xff0c;防止这个对象多次引…

文本分类任务算法演变(一)

文本分类任务算法演变 1.简介和应用场景1.1使用场景-打标签1.2使用场景-电商评论分析1.3使用场景-违规检测1.4使用场景-放开想象空间 2贝叶斯算法2.1预备知识-全概率公式2.2贝叶斯公式2.3文本分类中的应用2.3.1任务如下 2.4贝叶斯的优缺点 3.支持向量机3.1支持向量机-决策函数3…

libnl教程(2):发送请求

文章目录 前言示例示例代码构造请求创建套接字发送请求 简化示例 前言 前置阅读要求&#xff1a;libnl教程(1):订阅内核的netlink广播通知 本文介绍&#xff0c;libnl如何向内核发送请求。这包含三个部分&#xff1a;构建请求&#xff1b;创建套接字&#xff1b;发送请求。 …

Web开发:web服务器-Nginx的基础介绍(含AI文稿)

目录 一、Nginx的功能&#xff1a; 二、正向代理和反向代理的区别 三、Nginx负载均衡的主要功能 四、nginx安装目录下的各个文件&#xff08;夹&#xff09;的作用&#xff1a; 五、常用命令 一、Nginx的功能&#xff1a; 1.反向代理&#xff1a;例如我有三台服务器&#x…

大数据项目——实战项目:广告数仓(第二部分)集群环境部署

目录 第4章 广告数仓架构设计 第5章 集群环境准备 5.1 服务器准备 5.1.1 创建3台虚拟机 5.1.2 SSH无密登录配置 5.1.3 编写集群分发脚本xsync 5.1.4 JDK准备 5.1.5 环境变量配置说明 5.2 Hadoop部署 5.2.1 完全分布式运行模式&#xff08;开发重点&#xff09; 5.2…

去噪、梯度与边缘检测

图像噪点消除 噪声在图像处理中指的是图像中出现的干扰因素&#xff0c;通常由采集设备或传输过程引起。噪声使得图像的亮度变得不均匀或引入了随机的干扰点。常见的噪声类型包括&#xff1a; 高斯噪声&#xff1a;符合正态分布的噪声&#xff0c;会使图像变得模糊或出现噪点。…

Java基础之switch分支语句

switch分支语句 ​ switch语句也称为分支语句&#xff0c;其和if语句有点类似&#xff0c;都是用来判断值是否相等&#xff0c;但switch默认只支持byte、short、int、char这四种类型的比较&#xff0c;JDK8中也允许String类型的变量做对比。 语法&#xff1a; switch (表达式…

8.15 哈希表中等 139 Word Break review 467 Unique Substrings in Wraparound String

139 Word Break【逐一对比vs.多种 分割 组合】 片面思考的思路&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {//字符串和对应的字典&#xff0c;如果s种可以用空格分隔出一个或多个字典里的词就返回true//核心&#x…

windows 安装TVM

TVM支持在Windows环境下使用&#xff0c;但需要一些额外的配置。以下是如何在Windows Python环境中安装TVM的详细步骤。 1. 安装TVM的预备条件 在Windows上安装TVM之前&#xff0c;需要确保系统已经安装了以下工具和依赖项&#xff1a; Visual Studio: 安装包含C开发工具的V…

利用ZXing.Net Bindings for EmguCV识别条形码及绘制条形码边框17(C#)

上一篇博文&#xff1a;绘制条形码的效果不是很好&#xff1a;利用Emgucv绘制条形码边框16(C#)-CSDN博客 测试环境&#xff1a; win11 64位操作系统 visual studio 2022 ZXing.Net.Bindings.EmguCV 0.16.4 测试步骤如下&#xff1a; 1 新建.net framework 4.8的控制台项目…

Linux日常运维-主机名hosts

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 本小章内容就是Linux进阶部分的日常运维部分&#xff0c;掌握这些日常运维技巧或者方法在我们的日常运维过程中会带来很多方…