e2e: generate dex config dynamically
This commit is contained in:
parent
c70310730a
commit
c6d8bae147
|
@ -1,21 +0,0 @@
|
||||||
enablePasswordDB: true
|
|
||||||
issuer: http://127.0.0.1:5556/dex
|
|
||||||
logger:
|
|
||||||
level: debug
|
|
||||||
staticClients:
|
|
||||||
- id: example-app
|
|
||||||
name: Example App
|
|
||||||
redirectURIs:
|
|
||||||
- http://localhost:37791/source/oauth/callback/dex/
|
|
||||||
secret: ZXhhbXBsZS1hcHAtc2VjcmV0
|
|
||||||
staticPasswords:
|
|
||||||
- email: admin@example.com
|
|
||||||
hash: $2a$10$2b2cU8CPhOTaGrs1HRQuAueS7JTT5ZHsHSzYiFPm1leZck7Mc8T4W
|
|
||||||
userID: 08a8684b-db88-4b73-90a9-3cd1661f5466
|
|
||||||
username: admin
|
|
||||||
storage:
|
|
||||||
config:
|
|
||||||
file: /tmp/dex.db
|
|
||||||
type: sqlite3
|
|
||||||
web:
|
|
||||||
http: 0.0.0.0:5556
|
|
|
@ -31,14 +31,36 @@ class TestSourceOAuth(SeleniumTestCase):
|
||||||
def prepare_dex_config(self):
|
def prepare_dex_config(self):
|
||||||
"""Since Dex does not document which environment
|
"""Since Dex does not document which environment
|
||||||
variables can be used to configure clients"""
|
variables can be used to configure clients"""
|
||||||
|
config = {
|
||||||
|
"enablePasswordDB": True,
|
||||||
|
"issuer": "http://127.0.0.1:5556/dex",
|
||||||
|
"logger": {"level": "debug"},
|
||||||
|
"staticClients": [
|
||||||
|
{
|
||||||
|
"id": "example-app",
|
||||||
|
"name": "Example App",
|
||||||
|
"redirectURIs": [
|
||||||
|
self.url(
|
||||||
|
"passbook_sources_oauth:oauth-client-callback",
|
||||||
|
source_slug="dex",
|
||||||
|
)
|
||||||
|
],
|
||||||
|
"secret": self.client_secret,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"staticPasswords": [
|
||||||
|
{
|
||||||
|
"email": "admin@example.com",
|
||||||
|
# hash for password
|
||||||
|
"hash": "$2a$10$2b2cU8CPhOTaGrs1HRQuAueS7JTT5ZHsHSzYiFPm1leZck7Mc8T4W",
|
||||||
|
"userID": "08a8684b-db88-4b73-90a9-3cd1661f5466",
|
||||||
|
"username": "admin",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"storage": {"config": {"file": "/tmp/dex.db"}, "type": "sqlite3"},
|
||||||
|
"web": {"http": "0.0.0.0:5556"},
|
||||||
|
}
|
||||||
config_file = "./e2e/dex/config-dev.yaml"
|
config_file = "./e2e/dex/config-dev.yaml"
|
||||||
with open(config_file, "r+") as _file:
|
|
||||||
config = safe_load(_file)
|
|
||||||
client = config.get("staticClients")[0]
|
|
||||||
client["redirectURIs"][0] = self.url(
|
|
||||||
"passbook_sources_oauth:oauth-client-callback", source_slug="dex"
|
|
||||||
)
|
|
||||||
client["secret"] = self.client_secret
|
|
||||||
with open(config_file, "w+") as _file:
|
with open(config_file, "w+") as _file:
|
||||||
safe_dump(config, _file)
|
safe_dump(config, _file)
|
||||||
|
|
||||||
|
@ -71,12 +93,8 @@ class TestSourceOAuth(SeleniumTestCase):
|
||||||
return container
|
return container
|
||||||
sleep(1)
|
sleep(1)
|
||||||
|
|
||||||
def tearDown(self):
|
def create_objects(self):
|
||||||
self.container.kill()
|
"""Create required objects"""
|
||||||
super().tearDown()
|
|
||||||
|
|
||||||
def test_oauth_oidc(self):
|
|
||||||
"""test OAuth Source With With OIDC"""
|
|
||||||
sleep(1)
|
sleep(1)
|
||||||
# Bootstrap all needed objects
|
# Bootstrap all needed objects
|
||||||
authentication_flow = Flow.objects.get(slug="default-source-authentication")
|
authentication_flow = Flow.objects.get(slug="default-source-authentication")
|
||||||
|
@ -95,6 +113,13 @@ class TestSourceOAuth(SeleniumTestCase):
|
||||||
consumer_secret=self.client_secret,
|
consumer_secret=self.client_secret,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.container.kill()
|
||||||
|
super().tearDown()
|
||||||
|
|
||||||
|
def test_oauth_enroll(self):
|
||||||
|
"""test OAuth Source With With OIDC"""
|
||||||
|
self.create_objects()
|
||||||
self.driver.get(self.live_server_url)
|
self.driver.get(self.live_server_url)
|
||||||
|
|
||||||
self.wait.until(
|
self.wait.until(
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
"""OAuth Callback Views"""
|
"""OAuth Callback Views"""
|
||||||
from typing import Any, Callable, Dict, Optional
|
from typing import Any, Dict, Optional
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
|
@ -7,7 +7,7 @@ from django.http import Http404, HttpRequest, HttpResponse
|
||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.views.generic import RedirectView, View
|
from django.views.generic import View
|
||||||
from structlog import get_logger
|
from structlog import get_logger
|
||||||
|
|
||||||
from passbook.audit.models import Event, EventAction
|
from passbook.audit.models import Event, EventAction
|
||||||
|
@ -22,7 +22,6 @@ from passbook.flows.views import SESSION_KEY_PLAN
|
||||||
from passbook.lib.utils.urls import redirect_with_qs
|
from passbook.lib.utils.urls import redirect_with_qs
|
||||||
from passbook.policies.utils import delete_none_keys
|
from passbook.policies.utils import delete_none_keys
|
||||||
from passbook.sources.oauth.auth import AuthorizedServiceBackend
|
from passbook.sources.oauth.auth import AuthorizedServiceBackend
|
||||||
from passbook.sources.oauth.clients import BaseOAuthClient, get_client
|
|
||||||
from passbook.sources.oauth.models import OAuthSource, UserOAuthSourceConnection
|
from passbook.sources.oauth.models import OAuthSource, UserOAuthSourceConnection
|
||||||
from passbook.sources.oauth.views.base import OAuthClientMixin
|
from passbook.sources.oauth.views.base import OAuthClientMixin
|
||||||
from passbook.stages.password.stage import PLAN_CONTEXT_AUTHENTICATION_BACKEND
|
from passbook.stages.password.stage import PLAN_CONTEXT_AUTHENTICATION_BACKEND
|
||||||
|
|
|
@ -1,32 +1,13 @@
|
||||||
"""OAuth Redirect Views"""
|
"""OAuth Redirect Views"""
|
||||||
from typing import Any, Callable, Dict, Optional
|
from typing import Any, Dict
|
||||||
|
|
||||||
from django.conf import settings
|
from django.http import Http404
|
||||||
from django.contrib import messages
|
|
||||||
from django.http import Http404, HttpRequest, HttpResponse
|
|
||||||
from django.shortcuts import redirect
|
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.translation import ugettext as _
|
from django.views.generic import RedirectView
|
||||||
from django.views.generic import RedirectView, View
|
|
||||||
from structlog import get_logger
|
from structlog import get_logger
|
||||||
|
|
||||||
from passbook.audit.models import Event, EventAction
|
from passbook.sources.oauth.models import OAuthSource
|
||||||
from passbook.core.models import User
|
|
||||||
from passbook.flows.models import Flow
|
|
||||||
from passbook.flows.planner import (
|
|
||||||
PLAN_CONTEXT_PENDING_USER,
|
|
||||||
PLAN_CONTEXT_SSO,
|
|
||||||
FlowPlanner,
|
|
||||||
)
|
|
||||||
from passbook.flows.views import SESSION_KEY_PLAN
|
|
||||||
from passbook.lib.utils.urls import redirect_with_qs
|
|
||||||
from passbook.policies.utils import delete_none_keys
|
|
||||||
from passbook.sources.oauth.auth import AuthorizedServiceBackend
|
|
||||||
from passbook.sources.oauth.clients import BaseOAuthClient, get_client
|
|
||||||
from passbook.sources.oauth.models import OAuthSource, UserOAuthSourceConnection
|
|
||||||
from passbook.sources.oauth.views.base import OAuthClientMixin
|
from passbook.sources.oauth.views.base import OAuthClientMixin
|
||||||
from passbook.stages.password.stage import PLAN_CONTEXT_AUTHENTICATION_BACKEND
|
|
||||||
from passbook.stages.prompt.stage import PLAN_CONTEXT_PROMPT
|
|
||||||
|
|
||||||
LOGGER = get_logger()
|
LOGGER = get_logger()
|
||||||
|
|
||||||
|
|
Reference in New Issue