Несанкционированная ошибка при использовании OpenStack API, невозможно получить токен аутентификации от keystone

Я хочу использовать RESTful API, например.

https://nova.rc.nectar.org.au:8774/v1.1/1f283209946f428998e8d3930bb038d1

Но не могу получить токен аутентификации.

Я попробовал следующую команду, чтобы получить его (у меня нет прав администратора):

curl -d '{"auth":{"passwordCredentials":{"username": "miranda.zhang", "password": "mypass"}}}' -H "Content-type: application/json"  https://keystone.rc.nectar.org.au:5000/v2.0/tokens

Но все же получить

{"error": {"message": "The request you have made requires authentication.", "code": 401, "title": "Unauthorized"}}

Я также просмотрел python-keystoneclient, я попытался установить его.

python setup.py install

Но возвращает ошибку

Traceback (most recent call last):
  File "setup.py", line 18, in <module>
    import setuptools
ImportError: No module named setuptools

Вот файл openrc.sh, сгенерированный моим облачным провайдером, который вроде не помогает.

#!/bin/bash

# With the addition of Keystone, to use an openstack cloud you should
# authenticate against keystone, which returns a **Token** and **Service
# Catalog**.  The catalog contains the endpoint for all services the
# user/tenant has access to - including nova, glance, keystone, swift.
#
# *NOTE*: Using the 2.0 *auth api* does not mean that compute api is 2.0.  We
# will use the 1.1 *compute api*
export OS_AUTH_URL=https://keystone.rc.nectar.org.au:5000/v2.0/

# With the addition of Keystone we have standardized on the term **tenant**
# as the entity that owns the resources.
export OS_TENANT_ID=1f283209946f428998e8d3930bb038d1
export OS_TENANT_NAME="pt-1114"

# In addition to the owning entity (tenant), openstack stores the entity
# performing the action as the **user**.
export OS_USERNAME="miranda.zhang"

# With Keystone you pass the keystone password.
echo "Please enter your OpenStack Password: "
read -sr OS_PASSWORD_INPUT
export OS_PASSWORD=$OS_PASSWORD_INPUT

Ссылка:

  1. http://docs.openstack.org/developer/keystone/api_curl_examples.html
  2. http://api.openstack.org/api-ref-identity.html#identity
  3. http://docs.openstack.org/api/openstack-identity-service/2.0/content/POST_authenticate_v2.0_tokens_.html

Я попробовал предложение Барака включить имя арендатора, но все равно получил следующее:

HTTP/1.1 401 Unauthorized
Vary: X-Auth-Token
Content-Type: application/json
Content-Length: 114
Date: Sun, 29 Dec 2013 08:54:28 GMT

{"error": {"message": "The request you have made requires authentication.", "code": 401, "title": "Unauthorized"}}

Я установил клиент keystone с помощью Барака:

sudo apt-get install python-setuptools
sudo easy_install pip
sudo pip install python-keystoneclient

Но используя это так:

keystone --os-tenant-name pt-1114 --os-username USERNAME --os-password PASSWORD --os-auth-url https://keystone.rc.nectar.org.au:5000/v2.0/tokens -os-identity-api-version 2.0 --debug token-get

Я получил эту ошибку, в то время как token-get явно допустимый вариант.

usage: keystone [--version] [--timeout <seconds>]
                [--os-username <auth-user-name>]
                [--os-password <auth-password>]
                [--os-tenant-name <auth-tenant-name>]
                [--os-tenant-id <tenant-id>] [--os-auth-url <auth-url>]
                [--os-region-name <region-name>]
                [--os-identity-api-version <identity-api-version>]
                [--os-token <service-token>]
                [--os-endpoint <service-endpoint>]
                [--os-cacert <ca-certificate>] [--insecure]
                [--os-cert <certificate>] [--os-key <key>] [--os-cache]
                [--force-new-token] [--stale-duration <seconds>]
                <subcommand> ...
keystone: error: argument <subcommand>: invalid choice: '2.0' (choose from 'catalog', 'ec2-credentials-create', 'ec2-credentials-delete', 'ec2-credentials-get', 'ec2-credentials-list', 'endpoint-create', 'endpoint-delete', 'endpoint-get', 'endpoint-list', 'password-update', 'role-create', 'role-delete', 'role-get', 'role-list', 'service-create', 'service-delete', 'service-get', 'service-list', 'tenant-create', 'tenant-delete', 'tenant-get', 'tenant-list', 'tenant-update', 'token-get', 'user-create', 'user-delete', 'user-get', 'user-list', 'user-password-update', 'user-role-add', 'user-role-list', 'user-role-remove', 'user-update', 'discover', 'bootstrap', 'bash-completion', 'help', 'bash_completion')

Я только что понял, что мой существующий пароль для входа в веб-портал не будет работать, поскольку

Чтобы получить доступ к облаку Nectar с помощью OpenStack API, вам необходимо сгенерировать пароль. При этом любой существующий пароль будет забыт. Для генерации нового пароля нажмите кнопку «Сбросить пароль».

Задача решена.


person Miranda    schedule 29.12.2013    source источник


Ответы (2)


Вам не хватает имени арендатора в блоке json. Вот рабочий запрос на завивание:

curl -i 'http://192.168.9.70:5000/v2.0/tokens' -X POST -H "Content-Type: application/json" -H "Accept: application/json" -H "User-Agent: python-novaclient" -d '{"auth": {"tenantName": "TENANT", "passwordCredentials": {"username": "USERNAME", "password": "PASSWORD"}}}'

Я предлагаю вам установить клиент keystone с помощью pip:

sudo apt-get install pip
sudo pip install python-keystoneclient

Затем запустите любую команду keystone с параметром --debug, чтобы увидеть фактический json.

person Barak    schedule 29.12.2013
comment
сначала вы должны загрузить файл openrc с помощью «source openrc.sh», а затем запустить команду keystone, например: «keystone endpoint-list» - person Barak; 29.12.2013

См. приведенный ниже код в качестве примера:

  1. Используя команду curl:
curl http://<controller_ip>:5000/v2.0/tokens \
-X POST \
-d '{"auth":{"tenantName":"demo", "passwordCredentials":{"username":"demo", "password":"*****"}}}' \
-H "Content-type: application/json" | python -m json.tool

здесь python -m json.tool используется для печати вывода в удобочитаемом формате json.

  1. Использование Python API
url="<controller_ip>:5000"
params='{"auth":{"tenantName":"demo", "passwordCredentials":{"username":"demo", "password":"*****"}}}'
headers={"Content-Type": "application/json"}
conn=httplib.HTTPConnection(url)
conn.request("POST", "/v2.0/tokens", params,headers)
response=conn.getresponse()
data=response.read()
verify_services=json.loads(data)
auth_token=verify_services ['access']['token']['id']
print("Token=%s\n" % auth_token)
person IRSHAD    schedule 10.08.2016