OpenStack Swift + Keystone: impossibile determinare la locazione
-
21-12-2019 - |
Domanda
Sto cercando di accedere rapidamente con il ricciolo con autenticazione basata su Keystone (seguendo il KeystoneDocumenti API qui ).
Capitolo 1: Recupero del token:
curl -d '{"auth": {"passwordCredentials": {
"username": "USERNAME", "password": "PASSWORD"}}}' \
-H "Content-Type: application/json" \
http://identity:35357/v2.0/tokens
.
Risposta:
{
"access": {
"token": {
"expires": "2014-02-27T11:35:11Z",
"id": "TOKENID"
},
"serviceCatalog": [],
"user": {
"username": "USERNAME",
"roles_links": [],
"id": "USERID",
"roles": [],
"name": "NAME"
}
}
}
.
Si noti che, contrariamente a ciò che ha detto nel Documenti API ,Le informazioni degli inquilini mancano dalla risposta.
.
Capitolo 2: Autenticazione
curl -H "X-Auth-Token: TOKENID" http://swift/v1/AUTH_TENANTID/bucket
.
Risposta: 401 Unauthorized
.
Capitolo 3: Risoluzione dei problemi
Dopo aver guardato all'interno del middleware di Keystone Auth_Token, ho scoperto che non riesce quando si tenta di recuperare il inquilino dai dati 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.')
.
Poiché non ci sono informazioni inquilino nei dati del token, fallisce sempre. Cosa potrei sbagliare?
Soluzione
Questa risposta affronta la tua domanda di autenticazione iniziale, ma non il resto della domanda ...
La tua richiesta iniziale:
curl -d '{"auth": {"passwordCredentials": {
"username": "USERNAME", "password": "PASSWORD"}}}' \
-H "Content-Type: application/json" \
http://identity:35357/v2.0/tokens
.
ha bisogno di fornire un attributo tenantName
o tenantId
.Con uno di questi forniti, la risposta dovrebbe includere sia le informazioni del inquilino e un catalogo di servizi, per cercare altri endpoint del servizio.
Allora:
curl -d '{"auth": {"tenantName": "mytenant", "passwordCredentials": {
"username": "USERNAME", "password": "PASSWORD"}}}' \
-H "Content-Type: application/json" \
http://identity:35357/v2.0/tokens
.
Quale dovrebbe prenderti qualcosa del genere:
{
"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"
}
}
}
.