CloudStack:unable to verify user credentials and/or request signature解决

本文主要是介绍CloudStack:unable to verify user credentials and/or request signature解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当我使用HttpClient工具请求CloudStack API时,总是返回401错误信息,捣腾了一天,最后还是耐心的解决了这个问题,解决办法如下:

问题分析:根据提示信息要么是Api Key写错,要么是生成signature错误。

1) Api key问题:

UI界面生成的Api Key Secret Key 会在mysql数据库中保存,表名为user,字段名为api_keysecret_key,我建议复制数据库里面的这两个密钥值,因为在页面复制的api key或者secret key首尾可能会带有缩进字符,从而在请求的路径中匹配数据库里的密钥不正确。笔者经历过。

 

2) Signature问题:

后加入的参数未加入到计算signature的过程中:如下代码

以上两个是笔者遇到的问题。

最后经过调整完整版如下:

import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.Test;import yourpackage.utils.HttpClientUtil;//自定义的工具@Testpublic void testHttpClientUitl() throws Exception{String baseUrl = "http://localhost:8080/client/api?";String security = "H65hqe7U-T59TwpD2-0dNYbfcDYKaAnrQQoTFghyiMhMCrGm-pLJV5hGPc8fTHqn6XYxUowJNxjMXxilp4VY2Q";String apikey = "2n9_BGYlgUjLZMiHZi5U58_88QCcWLYHwm80WYoc8rd91XMsnlZ4kD9xvg3AMBKpuxz3P8OwOwJhtX-HpelrFg";TreeMap treeMap = new TreeMap((v1,v2)->{if(v1 == null || v2 == null){return 0;}return String.valueOf(v1).compareTo(String.valueOf(v2));});treeMap.put("command", "listUsers");treeMap.put("apiKey", apikey);treeMap.put("response", "json");StringBuilder str = new StringBuilder();treeMap.forEach((k,v)->{try {String encoded_v = URLEncoder.encode(String.valueOf(v), "UTF-8").replaceAll("\\+", "%20");str.append(k).append("=").append(encoded_v).append("&");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}});str.replace(str.lastIndexOf("&"), str.length(), "");System.out.println(str.toString());Mac mac = Mac.getInstance("HmacSHA1");SecretKeySpec keySpec =new SecretKeySpec(security.getBytes(),"HmacSHA1");mac.init(keySpec);mac.update(str.toString().toLowerCase().getBytes());byte[] encryptedBytes = mac.doFinal();String encodeBase64String = URLEncoder.encode(Base64.encodeBase64String(encryptedBytes), "UTF-8").replaceAll("\\+", "%20");System.out.println(encodeBase64String);str.append("&signature=").append(encodeBase64String);System.out.println(str);String httpUrl = baseUrl+str.toString();System.out.println(httpUrl);HttpClientUtil httpClient = HttpClientUtil.getInstance();String reponseContent = httpClient.sendHttpGet(httpUrl);System.out.println(reponseContent);}

最后,需要注意的是URLEncoder.encode(str)编码时会将空格转化为+号,需要将+号替换为%20,如下代码:URLEncoder.encode(str).replaceAll("\\+","%20");

为什么转化为%20,看以下链接查看URL编码部分知识。

https://www.w3school.com.cn/html/html_urlencode.asp

https://www.w3school.com.cn/tags/html_ref_urlencode.html

以上是笔者在刚开始使用cloudstack调用API的过程中遇到的问题,总结下问题。希望对你有所帮助。

 

这篇关于CloudStack:unable to verify user credentials and/or request signature解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/316023

相关文章

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Swagger在java中的运用及常见问题解决

《Swagger在java中的运用及常见问题解决》Swagger插件是一款深受Java开发者喜爱的工具,它在前后端分离的开发模式下发挥着重要作用,:本文主要介绍Swagger在java中的运用及常... 目录前言1. Swagger 的主要功能1.1 交互式 API 文档1.2 客户端 SDK 生成1.3

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复