1

Keystone ベースの認証を使用して curl で Swift にアクセスしようとしています ( Keystone API docs hereに従ってください)。

第 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 docsで述べられていることとは反対に、応答にテナント情報が含まれていないことに注意してください。


第 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.')

トークン データにテナント情報がないため、常に失敗します。私は何を間違っているのでしょうか?

4

1 に答える 1