2017-10-24 15 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 코드를 얻을. 관리자 자격 증명을 사용하여 로그인하면 오류가없고 프로젝트가 나열됩니다. 내가 알고 싶은 :

  • 왜 전체 오류가 발생합니까? (내가 읽은 바로는 자격 증명을 다시 인증해야하는 것처럼 보이고 좋아하지 않습니다.)
  • 관리자 자격 증명을 사용하지만 '일반'사용자 자격 증명을 사용하는 이유는 무엇입니까?
  • 어떻게 해결할 수 있습니까?

답변

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를.