Pregunta

Estoy intentando acceder a Swift con curl usando autenticación basada en Keystone (siguiendo el Documentos de la API de Keystone aquí).

Capítulo 1:Obteniendo el token:

curl -d '{"auth": {"passwordCredentials": {
                     "username": "USERNAME", "password": "PASSWORD"}}}' \
     -H "Content-Type: application/json" \
     http://identity:35357/v2.0/tokens

Respuesta:

{
  "access": {
    "token": {
      "expires": "2014-02-27T11:35:11Z", 
      "id": "TOKENID"
    }, 
    "serviceCatalog": [], 
    "user": {
      "username": "USERNAME", 
      "roles_links": [], 
      "id": "USERID", 
      "roles": [], 
      "name": "NAME"
    }
   }
}

Tenga en cuenta que, al contrario de lo que se dice en el Documentos API, falta la información del inquilino en la respuesta.


Capitulo 2:Autenticación

curl -H "X-Auth-Token: TOKENID" http://swift/v1/AUTH_TENANTID/bucket

Respuesta: 401 Unauthorized


Capítulo 3:Solución de problemas

Después de mirar dentro del middleware auth_token de Keystone, descubrí que falla al intentar recuperar el inquilino a partir de los datos del token:

def get_tenant_info():
    """Returns a (tenant_id, tenant_name) tuple from context."""
    def essex():
        """Essex puts the tenant ID and name on the token."""
        return (token['tenant']['id'], token['tenant']['name'])

    def pre_diablo():
        """Pre-diablo, Keystone only provided tenantId."""
         return (token['tenantId'], token['tenantId'])

    def default_tenant():
        """Pre-grizzly, assume the user's default tenant."""
        return (user['tenantId'], user['tenantName'])

    for method in [essex, pre_diablo, default_tenant]:
        try:
            return method()
        except KeyError:
             pass

    raise InvalidUserToken('Unable to determine tenancy.')

Como no hay información del inquilino en los datos del token, siempre falla.¿Qué podría estar haciendo mal?

¿Fue útil?

Solución

Esta respuesta aborda su pregunta de autenticación inicial, pero no el resto de la pregunta...

Su petición inicial:

curl -d '{"auth": {"passwordCredentials": {
                     "username": "USERNAME", "password": "PASSWORD"}}}' \
     -H "Content-Type: application/json" \
     http://identity:35357/v2.0/tokens

Necesita proporcionar un tenantName o tenantId atributo.Con cualquiera de estos proporcionados, su respuesta debe incluir tanto la información del inquilino y un catálogo de servicios, para buscar otros puntos finales de servicios.

Entonces:

curl -d '{"auth": {"tenantName": "mytenant", "passwordCredentials": {
                         "username": "USERNAME", "password": "PASSWORD"}}}' \
         -H "Content-Type: application/json" \
         http://identity:35357/v2.0/tokens

Lo que debería darte algo como esto:

{
  "access": {
    "metadata": {
      "roles": [
        "9fe2ff9ee4384b1894a90878d3e92bab",
        "0ecb6fccfd8546148cbb00b6d51364ce"
      ],
      "is_admin": 0
    },
    "user": {
      "name": "lars",
      "roles": [
        {
          "name": "_member_"
        },
        {
          "name": "admin"
        }
      ],
      "id": "436d522125584cf3a21ddcf628d59e2e",
      "roles_links": [],
      "username": "lars"
    },
    "serviceCatalog": [
      {
        "name": "nova",
        "type": "compute",
        "endpoints_links": [],
        "endpoints": [
          {
            "publicURL": "http://192.168.200.1:8774/v2/28a490a259974817b88ce490a74df8d2",
            "id": "264f2b4179ca4d6ca3a62b7347db11ce",
            "internalURL": "http://192.168.200.1:8774/v2/28a490a259974817b88ce490a74df8d2",
            "region": "RegionOne",
            "adminURL": "http://192.168.200.1:8774/v2/28a490a259974817b88ce490a74df8d2"
          }
        ]
      },
      .
      .
      .
    ],
    "token": {
      "tenant": {
        "name": "users/lars",
        "id": "28a490a259974817b88ce490a74df8d2",
        "enabled": true,
        "description": null
      },
      "id": "TOKENID",
      "expires": "2014-02-21T20:07:36Z",
      "issued_at": "2014-02-20T20:07:36.189044"
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top