أوبن ستاك سويفت + كيستون:غير قادر على تحديد الإيجار
-
21-12-2019 - |
سؤال
أحاول الوصول إلى Swift باستخدام حليقة باستخدام المصادقة المستندة إلى Keystone (بعد مستندات Keystone API هنا).
الفصل 1:جلب الرمز المميز:
curl -d '{"auth": {"passwordCredentials": {
"username": "USERNAME", "password": "PASSWORD"}}}' \
-H "Content-Type: application/json" \
http://identity:35357/v2.0/tokens
إجابة:
{
"access": {
"token": {
"expires": "2014-02-27T11:35:11Z",
"id": "TOKENID"
},
"serviceCatalog": [],
"user": {
"username": "USERNAME",
"roles_links": [],
"id": "USERID",
"roles": [],
"name": "NAME"
}
}
}
لاحظ أنه خلافا لما جاء في مستندات API, ، معلومات المستأجر مفقودة من الاستجابة.
الفصل 2:المصادقة
curl -H "X-Auth-Token: TOKENID" http://swift/v1/AUTH_TENANTID/bucket
إجابة: 401 Unauthorized
الفصل 3:استكشاف الأخطاء وإصلاحها
بعد البحث داخل البرنامج الوسيط Keystone auth_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.')
نظرًا لعدم وجود معلومات للمستأجر في بيانات الرمز المميز، فإنها تفشل دائمًا.ما الخطأ الذي قد أفعله؟
المحلول
تتناول هذه الإجابة سؤال المصادقة الأولي، ولكن ليس بقية السؤال...
طلبك الأولي:
curl -d '{"auth": {"passwordCredentials": {
"username": "USERNAME", "password": "PASSWORD"}}}' \
-H "Content-Type: application/json" \
http://identity:35357/v2.0/tokens
يحتاج إلى توفير إما أ tenantName
أو tenantId
يصف.مع توفير أي من هذه المعلومات، يجب أن يتضمن ردك معلومات المستأجر و كتالوج الخدمة، للبحث عن نقاط نهاية الخدمة الأخرى.
لذا:
curl -d '{"auth": {"tenantName": "mytenant", "passwordCredentials": {
"username": "USERNAME", "password": "PASSWORD"}}}' \
-H "Content-Type: application/json" \
http://identity:35357/v2.0/tokens
والتي يجب أن تحصل على شيء مثل هذا:
{
"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"
}
}
}
لا تنتمي إلى StackOverflow