《大话华为云OBS+IAM权限控制》连载 (二十五):已知用户名/密码,生成临时AK/SK构造OBS客户端的Python参考实现

举报
晓望峰 发表于 2020/02/06 21:30:24 2020/02/06
【摘要】 在进行IAM的OBS访问权限的测试或调试的时候,为了立即IAM权限更新后的配置效果,可以基于OBS SDK或API接口,使用临时AK/SK和SecurityToken认证方式,通过创建OBS客户端代码来方便地进行验证,本文给出了基于OBS Python SDK的Python参考代码片段

在进行IAM的OBS访问权限的测试或调试的时候,为了立即IAM权限更新后的配置效果,可以基于OBS SDK或API接口,使用临时AK/SK和SecurityToken认证方式,通过创建OBS客户端代码来方便地进行验证。


多数情况下,我们是已知目标IAM用户名和登录密码的(因为通过浏览器登陆进行IAM用户登录,这是必不可少的信息),根据华为云官方文档的资料,使用临时AK/SK和SecurityToken认证方式,通过创建OBS客户端可以通过如下三个步骤来实现:

  1. 使用IAM用户名和密码获取用户Token,可参见官网指南

  2. 通过步骤1得到的用户token,获取临时访问AK/SK和SecurityToken,可参见官网指南

  3. 使用步骤2得到的临时AK/SK和SecurityToken,基于OBS SDK编写代码创建OBS客户端,可参见官网指南


因为Python具有良好的交互式特性,所以我们可以使用OBS Python SDK来完成上述三个步骤,得到可以方便进行IAM的OBS控制权限变更验证。参考实现片段如下(基于Python 3语法,使用OBS SDK库 和 requests开源库

# -*- coding=utf8 -*-

import re
import os
import time
from datetime import datetime
from pprint import *
from obs import *
import requests
import json


def get_user_token(user_name, user_pwd, domain_name, iam_server="iam.myhuaweicloud.com"):
    """根据IAM用户名和密码,从IAM服务获取用户token"""
    
    json_data = {
      "auth": {
        "identity": {
          "methods": ["password"],
          "password": {
            "user": {
              "name": "%s" % user_name,
              "password": "%s" % user_pwd,
              "domain": {
                "name": "%s" % domain_name
              }
            }
          }
        },
        "scope": {
          "domain": {
            "name": "%s" % domain_name
          }
        }
      }
    }

    header_dict = {"Content-Type": "application/json;charset=utf8"}
    
    resp = requests.post("https://%s/v3/auth/tokens" % iam_server, json=json_data, headers=header_dict)
    assert resp.status_code < 300
    return resp.headers["X-Subject-Token"]


def get_sts_credentials_by_token(token, iam_server="iam.myhuaweicloud.com", during_secs=3600):
    """根据用户token,从IAM服务获取临时ak、sk + sts token"""
    
    header_dict = {"Content-Type": "application/json;charset=utf8", "X-Auth-Token": token}
    json_data = {
        "auth": {
            "identity": {
                "methods": [
                    "token"
                ],
                "token": {
                    "id": token,
                    "duration-seconds": min(24*3600, max(600, during_secs))
                }
            }
        }
    }

    resp = requests.post("https://%s/v3.0/OS-CREDENTIAL/securitytokens" % iam_server, headers=header_dict, json=json_data)
    assert resp.status_code < 300
    return json.loads(resp.content).get(u'credential')
        

if __name__ == "__main__":
    tenant_name = "tenant_test"
    user_name, password = "user_name", "password"

    # 根据IAM用户名和密码,从IAM服务获取用户token
    user_token = get_user_token(user_name, password, tenant_name)
    
    # 从IAM服务获取临时AK/SK和SecurityToken
    result = get_sts_credentials_by_token(user_token)
    ak, sk, security_token = result["access"], result[u'secret'], result[u'securitytoken']
    print("ak=%s, sk=%s\nSecurityToken=%s" % (ak, sk, security_token))
    
    # 构建OBS client客户端对象
    server = "http://obs.myhuaweicloud.com"
    ak, sk = result["access"], result[u'secret']
    security_token = result[u'securitytoken']

    client = ObsClient(ak, sk, server=server, security_token=security_token)
    
    # 然后就可以使用OBS client对象进行各种OBS功能的验证了,
    # 详细使用方法可参见OBS Python SDK的官方开发指导文档 https://support.huaweicloud.com/sdk-python-devg-obs/zh-cn_topic_0119680901.html


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。