百度云API鉴权-java

API认证 - 针对RESTful API调用者

前言:
经过几日的研究终于有成果,回想起来过程还是比较辛苦,在这里分享一下
1.获取ak和sk(或者与百度的合作方可以直接提供AK,SK)
AK(Access Key ID)/SK(Secret Access Key),主要用于对用户的调用行为进行鉴权和认证,相当于百度云API专用的用户名及密码。有关API认证的详细介绍,请参看API认证机制
## 如何获取AK/SK
登录百度智能云官方网站
登录web控制台,点击用户账号——》安全认证 进入Access Key
在这里插入图片描述
在这里插入图片描述
2.认证方式和匿名方式 鉴权

用户可以通过两种方式与百度云进行交互,包括认证方式和匿名方式。
对于认证方式,需要通过使用Access Key Id / Secret Access Key加密的方法来验证某个请求的发送者身份。
Access Key Id(AK)用于标示用户,Secret Access Key(SK)是用户用于加密认证字符串和百度云用来验证认证字符串的密钥,其中SK必须保密,只有用户和百度云知道。

当百度云接收到用户的请求后,系统将使用相同的SK和同样的认证机制生成认证字符串,并与用户请求中包含的认证字符串进行比对。
如果认证字符串相同,系统认为用户拥有指定的操作权限,并执行相关操作;
如果认证字符串不同,系统将忽略该操作并返回错误码。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述3.认证字符串生成机制
生成认证字符串的方法
在生成认证字符串之前,首先需要生成Signature。为了生成Signature,用户需要首先构建CanonicalRequest并计算SigningKey,具体内容如下图所示:
在这里插入图片描述
根据以上官网提供的文档以及上图的字符串的拼接进行代码的编写,上面的就不一一的解释了,不清楚的可以去官网查看,废话不多说直接贴代码:

package com.example.demo;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

import javax.print.attribute.HashAttributeSet;

import com.baidubce.auth.DefaultBceCredentials;
import com.baidubce.auth.SignOptions;
import com.baidubce.http.HttpMethodName;
import com.baidubce.internal.InternalRequest;
import com.baidubce.util.DateUtils;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

/**
 * 
 *
 * @author llx
 */
public class Test {

	public static void main(String[] args) {
		String ACCESS_KEY_ID = "xxxxxxx";//  用户的Access Key ID
		String SECRET_ACCESS_KEY = "xxxxxxxx";//  用户的Secret Access Key
		BceV1Signer v1Signer = new BceV1Signer();
		URI uri;
		try {
			int time=(int) (System.currentTimeMillis() / 1000);
			System.out.println(time);
			//传入所要调用的url
			uri = new URI("URL");
			InternalRequest internalRequest = new InternalRequest(HttpMethodName.POST , uri);
			HashMap<String, String> parameters = Maps.newHashMap();
			//传入的参数
			parameters.put("app_id", "xxxx");
			parameters.put("time", ""+time);
			internalRequest.setParameters(parameters);
			HashMap<String, String> map = Maps.newHashMap();
			map.put("Content-Type", "application/json; charset=utf-8");
			map.put("Host", "cloud.apollo.auto");
			map.put("x-bce-date", DateUtils.formatAlternateIso8601Date(new Date()));
			internalRequest.setHeaders(map);
			SignOptions signOptions = new SignOptions();
			signOptions.setHeadersToSign(Sets.newHashSet("host","x-bce-date"));
			v1Signer.sign(internalRequest, new DefaultBceCredentials(ACCESS_KEY_ID, 			      SECRET_ACCESS_KEY),signOptions);
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
	}
	
}

注意:
超时时间1800与签名结果之间为两个”/”,含义是使用默认签名方式,signedHeaders内容留空。

总结:
按照官方文档进行编码会出现很多意向不到的问题,让大家不走弯路,希望大家多多支持,互相学习。

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值