认证鉴权-j9九游会登录
调用接口有如下两种认证方式,您可以选择其中一种进行认证鉴权。
- ak/sk认证:通过ak(access key id)/sk(secret access key)加密调用请求。
- token认证:通过token认证调用请求。
ak/sk认证
ak/sk认证就是使用ak/sk对请求进行签名,在请求时将签名信息添加到消息头,从而通过身份认证。
- ak(access key id):访问密钥id。与私有访问密钥关联的唯一标识符;访问密钥id和私有访问密钥一起使用,对请求进行加密签名。
- sk(secret access key):与访问密钥id结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。
- ak/sk签名认证方式仅支持消息体大小12mb以内,12mb以上的请求请使用token认证。
- api网关除了校验时间格式外,还会校验该时间值与网关收到请求的时间差,如果时间差大于15分钟,api网关将拒绝请求。因此客户端必须注意本地时间与时钟服务器的同步,避免请求消息头x-sdk-date的值出现较大误差。
以下结合一个来介绍如何对一个请求进行签名,并通过http client发送一个https请求的过程。如果您不使用demo工程,也可以直接下载api网关签名工具在其他工程中引用。
- 生成ak/sk。如果已生成过ak/sk,则可跳过此步骤,找到原来已下载的ak/sk文件,文件名一般为:credentials.csv。
- 登录manageone运营面。
- 在页面右上角单击用户图标,在下拉列表中选择“个人设置”。
- 在“个人设置”页面选择“管理访问密钥”页签。
- 单击“新增访问密钥”,新建ak/sk。
- 单击“确定”,自动下载访问密钥文件。
- 下载成功后,在credentials.csv文件中获取ak和sk信息。
- 每个用户仅允许新增两个访问密钥。
- 为保证访问密钥的安全,访问密钥仅在初次生成时自动下载,后续不可再次通过管理控制台界面获取。请在生成后妥善保管。
- 获取示例代码,解压缩。
- 打开idea,在菜单栏选择“file > new > project from existing sources”。
选择解压后的“apigateway-java-sdk-x.x.x”文件夹,单击“ok”,导入示例工程。
- 在“import project”页面,选择“import project from external model”。
选择“maven”,然后单击“create”。

- idea支持在当前窗口或新窗口创建工程。此处,在弹窗中单击“new window”。
- 修改httpclientdemo.java中的api请求信息。
- 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_sdk_ak和huaweicloud_sdk_sk。以linux系统为例在本地将1中获取的ak/sk设置为环境变量。
- 打开终端,执行以下命令打开环境变量配置文件。
vi ~/.bashrc
- 在文件中添加如下环境变量配置,保存文件并退出编辑器。
export huaweicloud_sdk_ak="已获取的ak值" export huaweicloud_sdk_sk="已获取的sk值"
- 执行以下命令使配置文件生效。
source ~/.bashrc
- 打开终端,执行以下命令打开环境变量配置文件。
- 把api信息和已设置的环境变量替换到httpclientdemo.java中的对应位置。
如下示例所示,加粗部分信息需要替换成实际值。
public class httpclientdemo { private static final logger logger = loggerfactory.getlogger(httpclientdemo.class); public static void main(string[] args) throws exception { // create a new request. request httpclientrequest = new request(); try { // set the request parameters. // appkey, appsecrect, method and url are required parameters. // directly writing ak/sk in code is risky. for security, encrypt your ak/sk and store them in the configuration file or environment variables. // in this example, the ak/sk are stored in environment variables for identity authentication. // before running this example, set environment variables huaweicloud_sdk_ak and huaweicloud_sdk_sk. httpclientrequest.setkey(system.getenv("huaweicloud_sdk_ak")); httpclientrequest.setsecret(system.getenv("huaweicloud_sdk_sk")); // set a request method for http request. httpclientrequest.setmethod("post"); // set a request url in the format of https://{endpoint}/{uri}. httpclientrequest.set; httpclientrequest.addheader("content-type", "text/plain"); // set a body for http request. httpclientrequest.setbody("put your request body here"); } catch (exception e) { logger.error(e.getmessage()); return; } closeablehttpclient client = null; try { // sign the request. httprequestbase signedrequest = client.sign(httpclientrequest, constant.signature_algorithm_sdk_hmac_sha256); if (constant.do_verify) { // create httpclient and verify ssl certificate hostname.seturlhostname(httpclientrequest.gethost()); client = (closeablehttpclient) sslciphersuiteutil.createhttpclientwithverify(constant.international_protocol); } else { // create httpclient and do not verify ssl certificate client = (closeablehttpclient) sslciphersuiteutil.createhttpclient(constant.international_protocol); } httpresponse response = client.execute(signedrequest); // print the body of the response. httpentity resentity = response.getentity(); if (resentity != null) { logger.info("processing body with name: {} and value: {}", system.getproperty("line.separator"), entityutils.tostring(resentity, "utf-8")); } } catch (exception e) { logger.error(e.getmessage()); } finally { if (client != null) { client.close(); } } } }
- 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_sdk_ak和huaweicloud_sdk_sk。以linux系统为例在本地将1中获取的ak/sk设置为环境变量。
- 运行httpclientdemo.java,对请求进行签名、访问api并打印结果。
如果改变ak或sk的值,api网关将返回的错误信息error_msg。
token认证
token的有效期为24小时,需要使用一个token鉴权时,可以先缓存起来,避免频繁调用。
token在计算机系统中代表令牌(临时)的意思,拥有token就代表拥有某种权限。token认证就是在调用api的时候将token加到请求消息头,从而通过身份认证,获得操作api的权限。token可通过调用获取用户token接口获取。
云服务存在两种部署方式:项目级服务和全局级服务。
- 项目级服务需要获取项目级别的token,此时请求body中auth.scope的取值为project。
- 全局级服务需要获取全局级别的token,此时请求body中auth.scope的取值为domain。
调用本服务api需要项目级别的token,即调用获取用户token接口时,请求body中auth.scope的取值需要选择project,如下所示。
{
"auth": {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"name": "username",
"password": "********",
"domain": {
"name": "domainname"
}
}
}
},
"scope": {
"project": {
"name": "projectname"
}
}
}
}
在中以调用获取用户token的接口为例说明了如何调用api。获取token后,再调用其他接口时,您需要在请求消息头中添加“x-auth-token”,其值即为token。例如token值为“abcdefj....”,则调用接口时将“x-auth-token: abcdefj....”加到请求消息头即可,如下所示。
post https://iam.cn-north-1.myhuaweicloud.com/v3/auth/projects content-type: application/json x-auth-token: abcdefj....
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨