云服务器内容精选

  • Token的权限范围问题 在使用Token认证时,需要先申请Token,申请Token时需要填写Token是全局级别的还是项目级别的,如下申请Token接口的请求Body体中scope所示。 { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "username", "password": "********", "domain": { "name": "domainname" } } } }, "scope": { "project": { "name": "xxxxxxxx" } } }} 区域级服务需要获取项目级别的Token(区域默认对应一个项目,这个项目由系统预置),此时请求body中auth.scope的取值为project。 全局级服务需要获取全局级别的Token,此时请求body中auth.scope的取值为domain。 对于区域级服务,如果获取全局级别的Token,虽能使用该Token通过认证,但无法在后端通过鉴权,会导致请求失败。 例如获取一个全局Token,如下所示。 { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "name": "domainname" }, "name": "username", "password": "********" } } }, "scope": { "domain": { "id": "0503dda878000fed0f75c0096d70a960" } } }} 然后调用E CS 服务的查询ECS服务器列表的API,则会得到如下响应。表示Token与URL中项目不匹配,返回错误。 { "error": { "message": "tenantId in token is not the same with in URL.", "code": "Common.0018" }} 此种情况下,如果调用全局级服务的API,如TMS的API,则会正确调用。
  • Token与project不匹配 在使用Token认证时,经常会出现申请了Token,但是申请Token时的权限范围是区域A,但是请求时却请求调用区域B的资源,这是往往会得到类似如下的返回。表示Token与请求不匹配。 { "error": { "message": "tenantId in token is not the same with in URL.", "code": "Common.0018" }} 解决该问题的方法通常有两种: 使用正确权限范围的Token做请求认证,例如要请求区域B的资源,申请Token时填写 使用AK/SK认证鉴权。
  • 认证不通过 认证不通过的请求会被API网关拒绝,得到类似如下的返回,返回以APIGW开头的错误码。 比如使用Token认证请求没有带Token,返回如下。 { "error_msg": "Incorrect IAM authentication information: x-auth-token not found", "error_code": "APIGW.0301", "request_id": "7775eaa6b4bbe5934e565349bd27c298"} 使用了错误的Token,返回如下。 { "error_msg": "Incorrect IAM authentication information: decrypt token fail", "error_code": "APIGW.0301", "request_id": "0e812a89eee650de8e1f55cdae28b2c9"} 使用了错误的AK,会返回如下错误。 Traceback (most recent call last): File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/http/http_client.py", line 119, in response_hook resp.raise_for_status() File "/home/user/.local/lib/python3.7/site-packages/requests/models.py", line 953, in raise_for_status raise HTTPError(http_error_msg, response=self)requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://iam.myhuaweicloud.com/v3/projects?name=cn-north-4During handling of the above exception, another exception occurred:Traceback (most recent call last): File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/auth/credentials.py", line 93, in process_auth_params self.project_id = keystone_list_projects(http_client, request) File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/auth/iam_service.py", line 49, in keystone_list_projects raise e File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/auth/iam_service.py", line 47, in keystone_list_projects http_response = http_client.do_request_sync(request) File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/http/http_client.py", line 93, in do_request_sync self.response_error_hook_factory()(response) File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/http/http_client.py", line 130, in response_hook raise exceptions.ClientRequestException(response_status_code, sdk_error)huaweicloudsdkcore.exceptions.exceptions.ClientRequestException: ClientRequestException - {status_code:401,request_id:3f979354fbec41b3cc0bd28ce7865e20,error_code:APIGW.0301,error_msg:Incorrect IAM authentication information: ak xxxxxx not exist } 使用了错误的SK,返回如下。 huaweicloudsdkcore.exceptions.exceptions.ApiValueError: Failed to get project id, Incorrect IAM authentication information: verify aksk signature fail, canonicalRequest:GET|/v3/projects/|name=cn-north-4|host:iam.myhuaweicloud.com|x-sdk-date:20210902T011700Z||host;x-sdk-date|e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  • 认证、鉴权和授权 认证:由APIG来做(通过Token或AK/SK),判断调用者的身份,是否是合法用户,是否能否访问华为云。 鉴权:由云服务实现,判断调用者是否具有操作某项资源的权限。 授权:在IAM中操作,对某个用户/角色授权,让这个角色具有某种权限。 华为云支持Token和AK/SK两种认证方式。 Token的有效期为24小时,需要使用一个Token鉴权时,可以先缓存起来,避免频繁调用。 AK/SK长期有效。AK/SK加密调用请求。 推荐使用AK/SK认证,其安全性比Token认证要高。且华为云SDK默认使用AK/SK,优先推荐使用SDK调用API,相对REST API,SDK使用更为便利。
  • 终端节点Endpoint 在调用API时,需要通过Endpoint确定访问哪个服务,如下图所示。 对于全局级服务,只有一个Endpoint,例如TMS的Endpoint为tms.myhuaweicloud.com 对于区域级服务,每个region的Endpoint都不同,例如ECS在北京四的Endpoint为ecs.cn-north-4.myhuaweicloud.com。 所有服务的Endpoint详细信息都可以在https://developer.huaweicloud.com/endpoint查询。
  • 认证鉴权示例 下面通过举例为您介绍调用API的认证鉴权的关系。 调用API需要认证,如果没有认证,调用会遭到API网关的拒绝。会得到如下回显。 { "error_msg": "Incorrect IAM authentication information: x-auth-token not found", "error_code": "APIGW.0301", "request_id": "7775eaa6b4bbe5934e565349bd27c298"} 此处会返回APIGW.0301的错误码,错误信息意思是缺少x-auth-token,这是API网关返回的内容,表示认证不通过,不能访问。 假设新创建一个IAM用户,未加入任何用户组,这时这个IAM用户没有任何创建华为云资源的权限,如果此时先获取token,然后调用API,可以通过API网关的认证,但是后端云服务会鉴权说没有权限。 例如调用ECS服务的查询ECS服务器列表的API。 GET https://ecs.cn-north-4.myhuaweicloud.com/v1/05041fffa40025702f6dc009cc6f8f33/cloudservers/detail 会得到如下响应,这次返回的不是APIGW的错误码,而是ECS的错误码,表示没有权限,禁止执行该操作。 { "error": { "message": "do not have the required roles, forbidden to perform this action.", "code": "Ecs.0110" }} 如果将上面的用户加入到一个用户组,并给这个用户组授予查询ECS服务器列表的权限。重新 获取Token (注意这里需要重新获取Token,否则Token还是上一次的授权权限),然后调用ECS服务的查询ECS服务器列表的API,则会得到如下响应。 这是正确 { "count": 8, "servers": [ { "fault": null, "id": "78ccc986-016f-4405-94f9-c4d58421eca7", "name": "cce-612884-06913", "addresses": { "377a7782-72e4-4db2-96b7-841d5d6f18a8": [ {...