flask-oidc
flask-oidc copied to clipboard
Exception while trying to redirect to login in test environment
When I'm trying to create a test which is calling to the endpoint with the decorator @flask_oidc.require_login I got the following exception:
> r = client.get(url, follow_redirects=False)
test_auth.py:110:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/werkzeug/test.py:1162: in get
return self.open(*args, **kw)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/testing.py:238: in open
response = super().open(
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/werkzeug/test.py:1116: in open
response_parts = self.run_wsgi_app(request.environ, buffered=buffered)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/werkzeug/test.py:988: in run_wsgi_app
rv = run_wsgi_app(self.application, environ, buffered=buffered)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/werkzeug/test.py:1264: in run_wsgi_app
app_rv = app(environ, start_response)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/app.py:2552: in __call__
return self.wsgi_app(environ, start_response)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/app.py:2532: in wsgi_app
response = self.handle_exception(e)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask_cors/extension.py:178: in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask_restx/api.py:671: in error_router
return original_handler(f)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask_restx/api.py:669: in error_router
return self.handle_error(e)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/app.py:2529: in wsgi_app
response = self.full_dispatch_request()
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/app.py:1825: in full_dispatch_request
rv = self.handle_user_exception(e)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask_cors/extension.py:178: in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask_restx/api.py:671: in error_router
return original_handler(f)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask_restx/api.py:669: in error_router
return self.handle_error(e)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/app.py:1823: in full_dispatch_request
rv = self.dispatch_request()
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/app.py:1799: in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask_restx/api.py:402: in wrapper
resp = resource(*args, **kwargs)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/views.py:107: in view
return current_app.ensure_sync(self.dispatch_request)(**kwargs)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask_restx/resource.py:41: in dispatch_request
resp = meth(*args, **kwargs)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask_oidc/__init__.py:311: in decorated
login=url_for("oidc_auth.login"),
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/helpers.py:256: in url_for
return current_app.url_for(
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/app.py:2034: in url_for
return self.handle_url_build_error(error, endpoint, values)
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/flask/app.py:2023: in url_for
rv = url_adapter.build( # type: ignore[union-attr]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <werkzeug.routing.map.MapAdapter object at 0x7f5a93399790>
endpoint = 'oidc_auth.login', values = {}, method = None, force_external = False
append_unknown = True, url_scheme = None
def build(
self,
endpoint: t.Any,
... werkzeug code skipped for better readability ...
rv = self._partial_build(endpoint, values, method, append_unknown)
if rv is None:
> raise BuildError(endpoint, values, method, self)
E werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'oidc_auth.login'. Did you mean 'login' instead?
../../../.cache/pypoetry/virtualenvs/waiverdb-jda4S8Iw-py3.12/lib/python3.12/site-packages/werkzeug/routing/map.py:924: BuildError
In my local environment, I've replaced: url_for("oidc_auth.login"), to url_for("login"), directly in library and that's worked for me.
Hi! That's surprising, flask-oidc provides a blueprint named oidc_auth and registers it with the app when the extension is instantiated (or when init_app() is called). How is the OpenIDConnect object instantiated? Which version of flask-oidc are you using? Thanks.