أوبن ستاك سويفت + كيستون:غير قادر على تحديد الإيجار

StackOverflow https://stackoverflow.com//questions/22040455

سؤال

أحاول الوصول إلى 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"
    }
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top