【问题标题】:(Problem) authenticate in python script with openstack X-Auth-Token(问题)在 python 脚本中使用 openstack X-Auth-Token 进行身份验证
【发布时间】:2021-09-23 10:36:11
【问题描述】:

我尝试创建一个脚本来监控 openstack,为此我使用文档示例创建了一个令牌:

https://docs.openstack.org/api-quick-start/api-quick-start.html#openstack-api-quick-guide

$ curl -v -s -X POST $OS_AUTH_URL/auth/tokens?nocatalog   -H "Content-Type: application/json"   -d '{ "auth": { "identity": { "methods": ["password"],"password": {"user": {"domain": {"name": "'"$OS_USER_DOMAIN_NAME"'"},"name": "'"$OS_USERNAME"'", "password": "'"$OS_PASSWORD"'"} } }, "scope": { "project": { "domain": { "name": "'"$OS_PROJECT_DOMAIN_NAME"'" }, "name":  "'"$OS_PROJECT_NAME"'" } } }}' \
| python -m json.tool

它会毫无问题地为我创建它,如果我使用 curl 进行调用,它会通过终端返回数据

for example with:
$ curl -s -H "X-Auth-Token: $OS_TOKEN" \
  $OS_COMPUTE_API/flavors \
  | python -m json.tool

我想要的是放置我通过参数生成的令牌并将数据返回给我,问题似乎是我没有检测到令牌,因为它不会在请求中给我连接问题,只是没有对我进行身份验证,也没有加载正确的 json,所以我有代码

parser = argparse.ArgumentParser(description= info, formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('-t', '--token', help='openstack api token', required=True)
args = parser.parse_args()

user_token = args.token
headers = {
    'Content-Type': 'application/json',
    'Authorization':'X-Auth-Token ' +  user_token
}

# request url
req = {
    "flavors": "http://myip/v2.1/flavors",
    "images": "http://myip/v2.1/7d8fed2119e04ee79e15b5a2fac2f5da/images "
}
# get account data
try:
    result = requests.get(req["images"], headers=headers)
    result_data = json.loads(result.content)
except Exception as e :
    print('0')
    sys.exit("\nError requesting %s, please check conectivity" %(req["images"],))

if 'errors' in result_data :
    print('0')
    sys.exit(F'Error token, please check token: {result_data}')

clean_agent()
agent.update(
    agent_name = "Openstack_images_%s" ,
    agent_alias = "Openstack_images %s" ,
    description = "ID " 
)

clean_module()
modulo.update(
    name = "Openstack_image disk:",
    desc = "Openstack image is  %s " %str(result_data['images']['minDisk'] ),
    value = str(result_data['images']['minDisk']),
)

返回给我:

Traceback(最近一次调用最后一次): 文件“openstack.py”,第 243 行,在 desc = "Openstack 图像是 %s " %str(result_data['images']['minDisk'] ), KeyError: '图片'

我知道这是身份验证,因为如果您在未进行身份验证的情况下进入端点,则会得到以下 json: {"error": {"message": "您发出的请求需要认证。", "code": 401, "title": "Unauthorized"}}

我尝试将模块中的“图像”更改为“错误”,我得到了这个 回溯(最近一次通话最后): 文件“openstack.py”,第 243 行,在 desc = "Openstack 映像是 %s" %str(result_data['error']['minDisk'] ), KeyError: 'minDisk'

所以验证时一定是错误,我运行脚本:python3 openstack.py -t

我不知道是否有人可以帮助我,我不知道我的标题是错误的还是其他原因。

【问题讨论】:

  • 'Authorization':'X-Auth-Token ' + user_token 看起来不像一个正确的标题。我原以为你需要'X-Auth-Token': user_token。但是,我不明白检索user_token 的行。我会打印出所有相关变量的值。

标签: python api token openstack xauth


【解决方案1】:

请确保您生成的令牌与您为其指定其他资源的用户相同。以下是生成Token的示例代码,

url = [你的云机器IP在这里]

def gettokenForUser(username,password):

    payload1 = {
    "auth": {
        "identity": {
            "methods": [
                "password"
            ],
            "password": {
                "user": {
                    "name": username,
                    "domain": {
                        "name": "Default"
                    },
                    "password": password
                }
            }
        }
    }
    }

    response = requests.post('http://'+url+':5000/v3/auth/tokens',
                    headers={'content-type': 'application/json'},
                    data=json.dumps(payload1))

    return response.headers['X-Subject-Token']

【讨论】:

    猜你喜欢
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2021-12-29
    相关资源
    最近更新 更多