常见问题

子用户是否需要进行实名认证?

子用户无需进行实名认证,我们认为子用户是主账号下的员工或程序,具有主账号赋予的某些权限

子用户登录入口在哪里?

子用户登录与主账号登录共用一个页面,通过点击页面链接""切换。如图:

子用户采购云产品需要什么权限?

Access KEY的正确使用方式是什么,SK密钥丢失了怎么办?

适用场景

开发者应用访问浪潮云的OpenAPI时,需要使用由浪潮云颁发的SECRET KEY对请求进行签名。并携带签名信息发起请求。这个调用不应该在浏览器端,因为SECRET KEY不可能保存在浏览器端。

开发者需要将请求中的所有内容,包括请求uri、请求Body体、请求方式、请求头(header)及请求参数等信息,按照一定的顺序组装。使用指定的加密算法计算得出签名值signatrue。并携带此签名作为身份凭证访问浪潮云资源。

使用方式

步骤一

构建标准请求url签名字符串:

  1. 参数排序。以参数字母顺序排序,排序参数包括Query查询参数和Form表单参数。
  2. 获取请求uri,即url绝对路径部分。
  3. 将排序后的参数列表按照uri?key1=value1&key2=value2的方式拼接,得到url签名参数(uriToSign) 例如: 原始请求url为:
http://浪潮云/auth/v1/policies/testPolicyId?name=policy1&description=策略1

则按照步骤一得到的结果为:

/auth/v1/policies/testPolicyId?description=策略1&name=policy1

步骤二

构建header签名字符串: 生成13位毫秒级时间戳x-time,生成一组随机字符串x-random

将x-time、x-random、SECRET KEY(注意,不是ACCESS KEY。由浪潮云颁发)按照x-time+x-random+SECRET KEY 顺序直接拼接得到header签名参数(headerToSign)

步骤三

对请求body体字符串进行MD5加密运算,并转换为16进制,得出bodyToSign

例如,有请求body如下:

[{"action":"CreateEip", "context":{}, "region":"cn-north-3", "resourceType":"instance", "resourceAccountId":"", "instanceId": null, "resourceCreator":"", "service":"eip" }]

对其进行MD5加密,并转换为16进制后,得到

09ad60b0ed0e428af0fd3dd937ef5f49

步骤四

将httpMethod(本次请求方式,如GET、POST等)、headerToSign、uriToSign、bodyToSign,以换行符“\n”为分隔拼接。得到最终签名的字符串(fullToSign)。 例如: 原始请求为:

GET https://浪潮云/auth/v1/policies/testPolicyId?name=policy1&description=策略1
x-time: 1566789683802
x-random: f81c2640d4ed48cc8049e48f5833e163
x-secret-id: YTQxMGI1NWYtMTViOC00ODk2LThhZjUtZWJjZjA4OGUyMTMx
x-sign-algorithm: MD5
SECRET KEY为YzkxZjc4YWEtZDUzYi00MzQ1LWI0YTItZGY2OTkyNTcxNmM2

则最终得到的签名字符串(fullToSign)为:

GET
1566789683802f81c2640d4ed48cc8049e48f5833e163YzkxZjc4YWEtZDUzYi00MzQ1LWI0YTItZGY2OTkyNTcxNmM2
/auth/v1/policies/testPolicyId?description=策略1&name=policy1

步骤五

按照x-sign-algorithm参数的算法对fullToSign进行加密运算,并转换为16进制,再对结果进行base64编码后,得到最终的签名值signatrue。参考java示例代码如下:

signToBase64 = DigestUtils.md5Hex(fullToSign.getBytes())
signature = new String(Base64.encodeBase64(signToBase64.getBytes()), "UTF-8");

将signatrue以x-sign为键带入请求header中,发起请求,请求头中必须包含如下信息:

含义
x-sign-algorithm 哈希算法,支持sha1、md5、sha256
x-secret-id Access Key
x-time 13位毫秒级时间戳
x-random 随机字符串
x-sign 签名运算后得到的签名值signatrue

POST请求示例

现有post请求如下:

curl -X POST \
  https://浪潮云/auth/v1/has-permissions \
  -d '[{"action":"CreateEip", "context":{}, "region":"cn-north-3", "resourceType":"instance", "resourceAccountId":"", "instanceId": null, "resourceCreator":"", "service":"eip" }]'

按照步骤一操作得到uriToSign:

/auth/v1/has-permissions

按照步骤二操作得到headerToSign:

声明随机数x-random:da3df059255345b5b07e23601109f5e7
当前时间戳x-time:1573722631879
浪潮云颁发的SK:NmNmNzhmNGItNzczMi00ODJhLTkwNmEtYWExMWQ4NmI0NjA0
拼接得到
1573722631879da3df059255345b5b07e23601109f5e7NmNmNzhmNGItNzczMi00ODJhLTkwNmEtYWExMWQ4NmI0NjA0

按照步骤三操作得到bodyToSign:

09ad60b0ed0e428af0fd3dd937ef5f49

按照步骤四操作得到fullToSign:

POST
1573722631879da3df059255345b5b07e23601109f5e7NmNmNzhmNGItNzczMi00ODJhLTkwNmEtYWExMWQ4NmI0NjA0
/auth/v1/has-permissions
09ad60b0ed0e428af0fd3dd937ef5f49

按照步骤五操作得到signatrue:

YzdhMWI4NjBmNzRlNjI1NjAzOGE3Yzg4NTM0MzYxMTM=

最后,将x-random、x-time、signatrue以x-sign为键、AK以x-secret-id为键,x-sign-algorithm(签名加密算法,本例选择MD5)放入header中发起请求。最终请求信息如下:

curl -X POST \
  https://浪潮云/auth/v1/has-permissions \
  -H 'x-random: da3df059255345b5b07e23601109f5e7' \
  -H 'x-secret-id: N2QxZWYxMzMtMjY1MS00NGE4LWFhMTMtNjVjOGMyODgyNDk0' \
  -H 'x-time: 1573722631879' \
  -H 'x-sign-algorithm: MD5' \
  -H 'x-sign: YzdhMWI4NjBmNzRlNjI1NjAzOGE3Yzg4NTM0MzYxMTM=' \
  -d '[{"action":"CreateEip", "context":{}, "region":"cn-north-3", "resourceType":"instance", "resourceAccountId":"", "instanceId": null, "resourceCreator":"", "service":"eip" }]'

SK密钥丢失

Access Key由浪潮云颁发给访问者。丢失后无法找回,只能通过控制台删除已有密钥再新增。请妥善保存。

如何为子用户授权?

在控制台策略管理>自定义策略>创建自定义策略,创建相关资源权限的策略(详见操作指南>策略管理>创建自定义策略)。

然后在策略管理>自定义策略,列表中关联用户(详见操作指南>策略管理>关联用户);或在人员管理>用户管理中为用户授权(详见操作指南>人员管理>为用户授权)