Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Open API访问CBS接口(不用SDK,java版)

使用Open API访问CBS接口(不用SDK,java版)

原创
作者头像
wainsun
发布于 2023-09-14 08:05:16
发布于 2023-09-14 08:05:16
44900
代码可运行
举报
文章被收录于专栏:伟哥专栏伟哥专栏
运行总次数:0
代码可运行

前提,首先获取到腾讯云的AK SK

登录腾讯云官网控制台后访问

https://console.cloud.tencent.com/cam/capi

可以看到

这个密钥对即是我们访问API的钥匙。

新建一个main函数,整个API请求的签名共分为五个步骤

1.拼接请求串。

2.拼接待签名串

3.计算签名

4.拼接Authorization

5.请求API

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CBSAPI {

	private final static Charset UTF8 = StandardCharsets.UTF_8;	
	private final static String SECRET_ID = "改成自己的";	
	private final static String SECRET_KEY = "改成自己的";
	private final static String CT_JSON = "application/json; charset=utf-8";

	public static byte[] hmac256(byte[] key, String msg) throws Exception {
		Mac mac = Mac.getInstance("HmacSHA256");
		SecretKeySpec secretKeySpec = new SecretKeySpec(key, mac.getAlgorithm());
		mac.init(secretKeySpec);
		return mac.doFinal(msg.getBytes(UTF8));
	}

	public static String sha256Hex(String s) throws Exception {
		MessageDigest md = MessageDigest.getInstance("SHA-256");
		byte[] d = md.digest(s.getBytes(UTF8));
		return DatatypeConverter.printHexBinary(d).toLowerCase();
	}

	public static void main(String[] args) throws Exception {
		String service = "cbs";
		String host = "cbs.tencentcloudapi.com";
		String region = "ap-beijing";
		String action = "DescribeDisks";
		String version = "2017-03-12";
		String algorithm = "TC3-HMAC-SHA256";
		String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		// 注意时区,否则容易出错
		sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
		String date = sdf.format(new Date(Long.valueOf(timestamp + "000")));

		// ************* 步骤 1:拼接规范请求串 *************
		String httpRequestMethod = "POST";
		String canonicalUri = "/";
		String canonicalQueryString = "";
		String canonicalHeaders = "content-type:application/json; charset=utf-8\n" + "host:" + host + "\n"
				+ "x-tc-action:" + action.toLowerCase() + "\n";
		String signedHeaders = "content-type;host;x-tc-action";

		String payload = "{\"Limit\": 100}";
		String hashedRequestPayload = sha256Hex(payload);
		String canonicalRequest = httpRequestMethod + "\n" + canonicalUri + "\n" + canonicalQueryString + "\n"
				+ canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestPayload;
		System.out.println(canonicalRequest);

		// ************* 步骤 2:拼接待签名字符串 *************
		String credentialScope = date + "/" + service + "/" + "tc3_request";
		String hashedCanonicalRequest = sha256Hex(canonicalRequest);
		String stringToSign = algorithm + "\n" + timestamp + "\n" + credentialScope + "\n" + hashedCanonicalRequest;
		System.out.println(stringToSign);

		// ************* 步骤 3:计算签名 *************
		byte[] secretDate = hmac256(("TC3" + SECRET_KEY).getBytes(UTF8), date);
		byte[] secretService = hmac256(secretDate, service);
		byte[] secretSigning = hmac256(secretService, "tc3_request");
		String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase();
		System.out.println(signature);

		// ************* 步骤 4:拼接 Authorization *************
		String authorization = algorithm + " " + "Credential=" + SECRET_ID + "/" + credentialScope + ", "
				+ "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature;
		System.out.println(authorization);

		TreeMap<String, String> headers = new TreeMap<String, String>();
		headers.put("Authorization", authorization);
		headers.put("Content-Type", CT_JSON);
		headers.put("Host", host);
		headers.put("X-TC-Action", action);
		headers.put("X-TC-Timestamp", timestamp);
		headers.put("X-TC-Version", version);
		headers.put("X-TC-Region", region);

		StringBuilder sb = new StringBuilder();
		sb.append("curl -X POST https://").append(host).append(" -H \"Authorization: ").append(authorization)
				.append("\"").append(" -H \"Content-Type: application/json; charset=utf-8\"").append(" -H \"Host: ")
				.append(host).append("\"").append(" -H \"X-TC-Action: ").append(action).append("\"")
				.append(" -H \"X-TC-Timestamp: ").append(timestamp).append("\"").append(" -H \"X-TC-Version: ")
				.append(version).append("\"").append(" -H \"X-TC-Region: ").append(region).append("\"").append(" -d '")
				.append(payload).append("'");
		System.out.println(sb.toString());
	}
}

生成后会得到一个curl命令。例如:

curl -X POST https://cbs.tencentcloudapi.com -H "Authorization: TC3-HMAC-SHA256 Credential=AKIDc7ORGrMkwvhEZic2FE0XvCIAsRp6C83u/2023-09-14/cbs/tc3_request, SignedHeaders=content-type;host;x-tc-action, Signature=162933d7a933f4e552888d0d65297061e5e36fd83b44318a45daad46dc21c256" -H "Content-Type: application/json; charset=utf-8" -H "Host: cbs.tencentcloudapi.com" -H "X-TC-Action: DescribeDisks" -H "X-TC-Timestamp: 1694676570" -H "X-TC-Version: 2017-03-12" -H "X-TC-Region: ap-beijing" -d '{"Limit": 100}'

测试一下访问:

正常通过。所以就可以在自己的代码中构造request请求来实现与API的调用了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
云点播为什么鉴权一直都是失败的?
"Message": "The provided credentials could not be validated. Please check your signature is correct."
用户2939064
2020/06/01
1.5K0
V3手动鉴权失败之Java篇
腾讯云 API 全新升级 3.0 ,该版本进行了性能优化且全地域部署、支持就近和按地域接入、访问时延下降显著,接口描述更加详细、错误码描述更加全面、SDK增加接口级注释,让您更加方便快捷的使用腾讯云产品。人脸识别、文字识别,语音识别等众多产品均已接入云API 3.0。
周朋伟
2020/12/11
2.1K0
V3手动鉴权失败之Java篇
C#调用腾讯云文本翻译API,使用V3签名报错。
"Error":{"Code":"AuthFailure.SignatureFailure","Message":"The provided credentials could not be validated. Please check your signature is correct."
用户9018380
2021/09/20
2.1K0
【玩转 EdgeOne】在边缘函数实现腾讯云API 3.0签名
边缘函数是EdgeOne的一个特色功能,可以通过它在EdgeOne的边缘节点运行JavaScript函数。
kr
2023/10/24
6800
【有奖征文】用"云API"和PHP写一个查找域名是否可注册的API
在批量查询时,可以直接通过Python调用,比起官网的批量查询要灵活得多(官网的还要先用Python生成列表再复制,而且一次查太多网页还容易出问题)。
kr
2022/09/06
8.3K1
【有奖征文】用"云API"和PHP写一个查找域名是否可注册的API
[腾讯云] PHP实现无SDK依赖的EdgeOne缓存刷新
看最近EdgeOne活动力度很大,忍不住买了一年,准备把博客从CDN换成EdgeOne。
kr
2023/09/28
1.2K0
Tencent 人脸识别 Android V3 鉴权
注意:Android9.0 默认是禁止所有的http,且android4.0以后不能在主线程发起网络请求。
HI hero
2020/04/10
1.8K0
Tencent 人脸识别 Android  V3 鉴权
腾讯云V3签名方法之iOS
签名方法 v3 (TC3-HMAC-SHA256)功能上覆盖了以前的签名方法 v1,而且更安全,支持更大的请求,支持 json 格式,性能有一定提升,推荐使用该签名方法计算签名。
许岳操
2020/08/03
3.5K0
腾讯云V3签名方法之iOS
纯shell实现腾讯云APIv3签名及访问
腾讯云 API 会对每个请求进行身份验证,用户需要使用安全凭证,经过特定的步骤对请求进行签名(Signature),每个请求都需要在公共参数中指定该签名结果并以指定的方式和格式发送请求。
若海
2023/09/10
7.3K1
V3手动鉴权失败之C#篇
腾讯云 API 全新升级 3.0 ,该版本进行了性能优化且全地域部署、支持就近和按地域接入、访问时延下降显著,接口描述更加详细、错误码描述更加全面、SDK增加接口级注释,让您更加方便快捷的使用腾讯云产品。人脸识别、文字识别,语音识别等众多产品均已接入云API 3.0。
周朋伟
2020/12/31
1.9K0
V3手动鉴权失败之C#篇
[php实现]通过腾讯云Api上传SSL证书
笔者使用的轻量应用服务器安装的Windows系统(集成环境没有更新证书功能),SSL证书是acme.sh生成的多域名证书,有效期90天。因为使用了腾讯云的CDN,每次生成新证书需要手动上传到腾讯云,太麻烦了。既然官方提供了上传证书的Api(UploadCertificate),服务器是php环境,就想用php撸个小工具,实现自动上传SSL证书到腾讯云。
TDP-苏苏
2022/03/01
10.1K0
[php实现]通过腾讯云Api上传SSL证书
180行代码实现全球短信发送功能(无SKD依赖)
本文提供的代码不依赖官方SDK,为方便读者理解,文章中提供的代码片段包含详细的注释。完整功能代码见文末,删减冗余注释和空行后不足180行。
若海
2023/08/12
18K1
【玩转 EdgeOne】使用EdgeOne边缘函数搭建域名注册查询API
突然心血来潮,想注册个4位的.cn域名,但一个个查显然是不可能的事情,于是萌生了写一个查询域名是否已注册的API的想法。
HuoYun
2023/10/31
6700
V3手动鉴权失败之Nodejs篇
腾讯云 API 全新升级 3.0 ,该版本进行了性能优化且全地域部署、支持就近和按地域接入、访问时延下降显著,接口描述更加详细、错误码描述更加全面、SDK增加接口级注释,让您更加方便快捷的使用腾讯云产品。人脸识别、文字识别,语音识别等众多产品均已接入云API 3.0。
周朋伟
2020/11/06
2.4K0
V3手动鉴权失败之Nodejs篇
V3手动鉴权失败之PHP篇
腾讯云 API 全新升级 3.0 ,该版本进行了性能优化且全地域部署、支持就近和按地域接入、访问时延下降显著,接口描述更加详细、错误码描述更加全面、SDK增加接口级注释,让您更加方便快捷的使用腾讯云产品。人脸识别、文字识别,语音识别等众多产品均已接入云API 3.0。
周朋伟
2020/12/25
2.2K0
V3手动鉴权失败之PHP篇
【AI接入迷你赛】腾讯云产品鉴权签名 v3
腾讯云 API 会对每个请求进行身份验证,用户需要使用安全凭证,经过特定的步骤对请求进行签名 Signature,每个请求都需要在公共请求参数中指定该签名结果并以指定的方式和格式发送请求 。
用户4299935
2019/09/11
5.9K1
【AI接入迷你赛】腾讯云产品鉴权签名 v3
基于(PHP)人脸核身微信H5页面(普通模式)搭建
(2)腾讯云控制台开通人脸核身权限 https://console.cloud.tencent.com/faceid/access
HI hero
2020/11/23
3.5K0
Swift 实现腾讯云 TC3-HMAC-SHA256 签名方法
最近在接入一些腾讯云的API,腾讯是不是歧视我 iOS 没有 OC 示例,也没有 Swift 示例,可能是面向服务器的吧,但是边上安卓的童鞋直接复制JAVA代码就跑起来~~~我难受。
韦弦zhy
2020/03/20
3.2K0
Swift 实现腾讯云 TC3-HMAC-SHA256 签名方法
V3手动鉴权失败之Go篇
腾讯云 API 全新升级 3.0 ,该版本进行了性能优化且全地域部署、支持就近和按地域接入、访问时延下降显著,接口描述更加详细、错误码描述更加全面、SDK增加接口级注释,让您更加方便快捷的使用腾讯云产品。人脸识别、文字识别,语音识别等众多产品均已接入云API 3.0。
周朋伟
2020/11/16
1.2K0
V3手动鉴权失败之Go篇
使用Postman访问腾讯云API3.0
将腾讯云API3.0 公共参数设置为全局变量。其中SecretId、SecretKey替换为腾讯云访问控制页面的API秘钥,其他参数任意填写
1011689
2020/08/04
10.1K8
使用Postman访问腾讯云API3.0
相关推荐
云点播为什么鉴权一直都是失败的?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验