2017-10-24 17 views
0

私はプロジェクトのリストを作成しようとしています(ただし、これを実行しようと試みてもユーザをリストに入れようとしても同じことが起こりますので、APIコールにエラーを一般化してみましょう)。OpenStack - KeyStoneに認証が必要401

File "/usr/lib/python2.7/site-packages/cherrypy/_cprequest.py", line 656, in respond 
    response.body = self.handler() 
    File "/usr/lib/python2.7/site-packages/cherrypy/lib/encoding.py", line 188, in __call__ 
    self.body = self.oldhandler(*args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/cherrypy/lib/jsontools.py", line 61, in json_handler 
    value = cherrypy.serving.request._json_inner_handler(*args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/cherrypy/_cpdispatch.py", line 34, in __call__ 
    return self.callable(*self.args, **self.kwargs) 
    File "/var/www/frontend/controllers/api/user.py", line 63, in PUT 
    print keystoneClient.projects.list() 
    File "/usr/lib/python2.7/site-packages/positional/__init__.py", line 101, in inner 
    return wrapped(*args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/keystoneclient/v3/projects.py", line 107, in list 
    **kwargs) 
    File "/usr/lib/python2.7/site-packages/keystoneclient/base.py", line 75, in func 
    return f(*args, **new_kwargs) 
    File "/usr/lib/python2.7/site-packages/keystoneclient/base.py", line 383, in list 
    self.collection_key) 
    File "/usr/lib/python2.7/site-packages/keystoneclient/base.py", line 124, in _list 
    resp, body = self.client.get(url, **kwargs) 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/adapter.py", line 173, in get 
    return self.request(url, 'GET', **kwargs) 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/adapter.py", line 331, in request 
    resp = super(LegacyJsonAdapter, self).request(*args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/adapter.py", line 98, in request 
    return self.session.request(url, method, **kwargs) 
    File "/usr/lib/python2.7/site-packages/positional/__init__.py", line 101, in inner 
    return wrapped(*args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/session.py", line 387, in request 
    auth_headers = self.get_auth_headers(auth) 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/session.py", line 647, in get_auth_headers 
    return auth.get_headers(self, **kwargs) 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/plugin.py", line 84, in get_headers 
    token = self.get_token(session) 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/identity/base.py", line 90, in get_token 
    return self.get_access(session).auth_token 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/identity/base.py", line 136, in get_access 
    self.auth_ref = self.get_auth_ref(session) 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/identity/v3/base.py", line 167, in get_auth_ref 
    authenticated=False, log=False, **rkwargs) 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/session.py", line 595, in post 
    return self.request(url, 'POST', **kwargs) 
    File "/usr/lib/python2.7/site-packages/positional/__init__.py", line 101, in inner 
    return wrapped(*args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/keystoneauth1/session.py", line 484, in request 
    raise exceptions.from_response(resp, method, url) 
Unauthorized: The request you have made requires authentication. (HTTP 401) (Request-ID: req-39d02130-6f47-4cae-bc30-0b645296752e) 

コード::これは、通常のユーザーの資格情報を使用している間に発生

import cherrypy 
import ldap 
from keystoneauth1 import loading 
from keystoneauth1 import session as session 
from keystoneclient.v3 import client as client 
from keystoneauth1.identity import v3 
import json 

    # Storing username and password in a cherrypy session 
    cherrypy.session['username'] = data.get("username") 
    cherrypy.session['password'] = data.get("password").replace(" ","%20") 

    # Setting up KeyStone Client 
    auth = v3.Password(
     auth_url = KEYSTONE_URL, 
     username = cherrypy.session['username'], 
     password = cherrypy.session['password'], 
     user_domain_name="default", 
     domain_name = "default" 
    ) 
    sess = session.Session(auth=auth, verify='/etc/ssl/certs/ca-bundle.crt') 
    keystoneClient = client.Client(session=sess) 

    # Getting list of projects 
    print keystoneClient.projects.list() 

私はこれを行うたびに、私は、次のHTTP 401コードを取得します。管理者の資格情報を使用してログインすると、エラーはなく、プロジェクトが一覧表示されます。なぜ、全体的なエラーが発生している

  • :私が知りたいのですが? (私が読んだところでは、資格情報を再認証する必要があり、それが好きではないようです)
  • admin資格情報を使用しているのに「通常の」ユーザー資格情報を使用しているのはなぜですか?
  • どうすれば解決できますか?

答えて

0

スコープのないトークンには関連するロールがないため、最初の質問に答えるにはプロジェクトスコープのトークンが必要です。スコープのないトークンでは操作はできません。ここでは、トークンをスコープのプロジェクトを取得する方法は次のとおりです。

auth = v3.Password(auth_url=auth_url, 
        username=username, 
        password=password, 
        user_domain_name="default", 
        project_name=project_name, 
        project_domain_name="default") 
sess = session.Session(auth=auth, verify='/etc/ssl/certs/ca-bundle.crt') 
keystoneClient = client.Client(session=sess) 

、通常のユーザーのために、あなたは、プロバイダでのプロジェクトのリスト全体を取り戻すことができないし、それが正常に動作し、なぜこれがなく、ために管理者の資格情報を使用している

通常のユーザーのものです。

これを解決するには、その普通のユーザーのuser_idを知る必要があります。一つの方法は、キーストーンのクライアントを取得するために管理者の資格情報を使用して

keystone.users.get(user="username") 

呼び出すそれとも、OpenStackのダッシュボードを使用して、アイデンティティダッシュボードに行くことです。 Userと呼ばれるパネルがあり、そこからuser_idを見ることができます。

あなたはuser_idを持っていたら、あなたは行うことができます:

keystoneClient.projects.list(user=user_id) 

HTH。

関連する問題