"Unauthorized: The request you have made requires authentication. (HTTP 401)" on Fiware Horizon

Umair47 picture Umair47 · Jan 9, 2017 · Viewed 7.9k times · Source

I am new to FIWARE. On my Ubuntu 16.04, I have setup Fiware's KeyRock which is a combination of OpenStack Keystone Identity Management and Horizon Dashboard. I have used this guide to set up everything.

After installing Keystone (which is a RESTful API), I have used curl to send HTTP requests and everything is working fine, i.e. I can run these commands on the keystone server using curl.

However, when I run Horizon on the same server using the reference Django project located in the openstack_dashboard directory with:

sudo tools/with_venv.sh python manage.py runserver 0.0.0.0:8000,

Horizon server starts with no errors but when I access it via browser, I get the following error:

 A server error occured. Please contact the administrator

On the Keystone server console, I get the following error:

 2017-01-09 11:53:40.962 13285 ERROR keystone.notifications [-] Failed to construct notifier  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications Traceback (most recent call last):
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications   File "/keystone/keystone/notifications.py", line 220, in _get_notifier  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications     transport = messaging.get_transport(CONF)  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications   File "/keystone/.venv/local/lib/python2.7/site-packages/oslo/messaging/transport.py", line 185, in get_transport  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications     invoke_kwds=kwargs)  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications   File "/keystone/.venv/local/lib/python2.7/site-packages/stevedore/driver.py", line 45, in __init__  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications     verify_requirements=verify_requirements,  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications   File "/keystone/.venv/local/lib/python2.7/site-packages/stevedore/named.py", line 55, in __init__  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications     verify_requirements)  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications   File "/keystone/.venv/local/lib/python2.7/site-packages/stevedore/extension.py", line 170, in _load_plugins  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications     self._on_load_failure_callback(self, ep, err)  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications   File "/keystone/.venv/local/lib/python2.7/site-packages/stevedore/driver.py", line 50, in _default_on_load_failure  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications     raise err  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications ImportError: cannot import name _uuid_generate_random  
 2017-01-09 11:53:40.962 13285 TRACE keystone.notifications  
 2017-01-09 11:53:40.964 13285 WARNING keystone.common.wsgi [-] Authorization failed. The request you have made requires authentication. from 127.0.0.1  
 2017-01-09 11:53:40.970 13285 INFO eventlet.wsgi.server [-] 127.0.0.1 - - [09/Jan/2017 11:53:40] "POST /v3/auth/tokens HTTP/1.1" 401 331 0.261293

On the Horizon server console, I get the following error:

 DEBUG:idm_logger:Creating a new internal keystoneclient connection to http://0.0.0.0:5000/v3.
 Unauthorized: The request you have made requires authentication. (HTTP 401)
 Traceback (most recent call last):
   File "/horizon/openstack_dashboard/fiware_api/keystone.py", line 990, in _get_element_and_cache
resource_element = function(request, element)
   File "/horizon/openstack_dashboard/fiware_api/keystone.py", line 1022, in <lambda>
request, basic, lambda req, n: internal_keystoneclient(req).roles.find(name=n), pickle_props=['name'])
   File "/horizon/openstack_dashboard/fiware_api/keystone.py", line 64, in internal_keystoneclient
cache.set(CACHE_CLIENT, keystoneclient.session.get_token(), INTERNAL_CLIENT_CACHE_TIME)
   File "/horizon/.venv/src/python-keystoneclient/keystoneclient/session.py", line 610, in get_token
return (self.get_auth_headers(auth) or {}).get('X-Auth-Token')
   File "/horizon/.venv/src/python-keystoneclient/keystoneclient/session.py", line 589, in get_auth_headers
return auth.get_headers(self, **kwargs)
   File "/horizon/.venv/src/python-keystoneclient/keystoneclient/auth/base.py", line 114, in get_headers
token = self.get_token(session)
   File "/horizon/.venv/src/python-keystoneclient/keystoneclient/auth/identity/base.py", line 104, in get_token
return self.get_access(session).auth_token
   File "/horizon/.venv/src/python-keystoneclient/keystoneclient/auth/identity/base.py", line 144, in get_access
self.auth_ref = self.get_auth_ref(session)
   File "/horizon/.venv/src/python-keystoneclient/keystoneclient/auth/identity/v3.py", line 127, in get_auth_ref
authenticated=False, log=False, **rkwargs)
   File "/horizon/.venv/src/python-keystoneclient/keystoneclient/session.py", line 488, in post
return self.request(url, 'POST', **kwargs)
   File "/horizon/.venv/src/python-keystoneclient/keystoneclient/utils.py", line 318, in inner
return func(*args, **kwargs)
   File "/horizon/.venv/src/python-keystoneclient/keystoneclient/session.py", line 389, in request
raise exceptions.from_response(resp, method, url)
 Unauthorized: The request you have made requires authentication. (HTTP 401)
 Traceback (most recent call last):
   File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run
self.result = application(self.environ, self.start_response)
   File "/horizon/.venv/local/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 64, in __call__
return self.application(environ, start_response)
   File "/horizon/.venv/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 168, in __call__
self.load_middleware()
   File "/horizon/.venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 46, in load_middleware
mw_instance = mw_class()
   File "/horizon/.venv/local/lib/python2.7/site-packages/django/middleware/locale.py", line 23, in __init__
for url_pattern in get_resolver(None).url_patterns:
   File "/horizon/.venv/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 367, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
   File "/horizon/.venv/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 361, in urlconf_module
self._urlconf_module = import_module(self.urlconf_name)
   File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
   File "/horizon/openstack_dashboard/urls.py", line 36, in <module>
from openstack_dashboard.dashboards.idm_admin.user_accounts \
   File "/horizon/openstack_dashboard/dashboards/idm_admin/user_accounts/views.py", line 28, in <module>
from openstack_dashboard.dashboards.idm_admin.user_accounts \
   File "/horizon/openstack_dashboard/dashboards/idm_admin/user_accounts/forms.py", line 195, in <module>
class UpdateAccountForm(forms.SelfHandlingForm, UserAccountsLogicMixin):
   File "/horizon/openstack_dashboard/dashboards/idm_admin/user_accounts/forms.py", line 202, in UpdateAccountForm
choices=get_account_choices())
   File "/horizon/openstack_dashboard/dashboards/idm_admin/user_accounts/forms.py", line 172, in get_account_choices
use_idm_account=True),
   File "/horizon/openstack_dashboard/fiware_api/keystone.py", line 1022, in get_basic_role
request, basic, lambda req, n: internal_keystoneclient(req).roles.find(name=n), pickle_props=['name'])
   File "/horizon/openstack_dashboard/fiware_api/keystone.py", line 997, in _get_element_and_cache
exceptions.handle(request)
   File "/horizon/horizon/exceptions.py", line 291, in handle
messages.error(request, message or fallback)
   File "/horizon/horizon/messages.py", line 83, in error
fail_silently=fail_silently)
   File "/horizon/horizon/messages.py", line 41, in add_message
if not horizon_message_already_queued(request, message):
   File "/horizon/horizon/messages.py", line 28, in horizon_message_already_queued
if request.is_ajax():
 AttributeError: 'NoneType' object has no attribute 'is_ajax'
 [09/Jan/2017 12:39:35] "GET / HTTP/1.1" 500 59 

I am sending a GET request via the browser but the Keystone server is receiving a POST request as indicated in its console output. I don't understand why is this so.

Answer

MrAmerica picture MrAmerica · Jan 10, 2017

It looks like the Horizon server is not able to verify the credentials.

In the case of Fiware, you would get this error on Horizon server if the file local_settings.py (located in the /horizon/openstack_dashboard/local/ directory) is not properly configured. In this file, there is a dictionary named IDM_USER_CREDENTIALS where you have to set the password for the admin profile that was created when you populated the database of Keystone. It is also given in the link that you provided. Try changing the password and see if it works.