diff --git a/.docker/oathkeeper/config.yaml b/.docker/oathkeeper/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1d1768eb551582b90ce753b5cbfbf6c0295b5651 --- /dev/null +++ b/.docker/oathkeeper/config.yaml @@ -0,0 +1,73 @@ +# see https://www.ory.sh/docs/oathkeeper/reference/configuration +# also documents environment variables + +serve: + proxy: + port: 4455 # run the proxy at port 4455 + api: + port: 4456 # run the api at port 4456 + +access_rules: + repositories: + - file:///opt/config/rules.yaml + +errors: + fallback: + - json + handlers: + json: + enabled: true + config: + verbose: true + redirect: + enabled: true + config: + to: https://www.ory.sh/docs + +mutators: + header: + enabled: true + config: + headers: + X-Holi-User-ID: '{{ print .Subject }}' + noop: + enabled: true + id_token: + enabled: true + config: + issuer_url: http://oathkeeper.okuna:4456/ + jwks_url: file:///opt/config/jwks.json + claims: '{ + "aud": [ "https://project-holi.org/services/okuna/api" ], + "email": "{{ if .Extra.identity }}{{ .Extra.identity.traits.email }}{{ else }}anonymous{{ end }}" + }' + +authorizers: + allow: + enabled: true + deny: + enabled: true + +authenticators: + anonymous: + enabled: true + config: + subject: anonymous # =default + cookie_session: + enabled: true + config: + check_session_url: https://mystifying-carver-akajr6v4t8.projects.oryapis.com/sessions/whoami + preserve_path: true + extra_from: '@this' + subject_from: 'identity.id' + only: + - ory_kratos_session + bearer_token: + enabled: true + config: + check_session_url: https://mystifying-carver-akajr6v4t8.projects.oryapis.com/sessions/whoami + preserve_path: true + extra_from: '@this' + subject_from: 'identity.id' + token_from: + header: X-Session-Token diff --git a/.docker/oathkeeper/jwks.json b/.docker/oathkeeper/jwks.json new file mode 100644 index 0000000000000000000000000000000000000000..44c554d20b11ca4da881fe05c617470fbd4e7f34 --- /dev/null +++ b/.docker/oathkeeper/jwks.json @@ -0,0 +1,18 @@ +{ + "keys": [ + { + "use": "sig", + "kty": "RSA", + "kid": "803ed651-023d-4c91-95b7-04fd6c15b3da", + "alg": "RS256", + "n": "pGcGAv0MygEWI5epZkPPOtTXAjXmkXtdDHnlXAknYpUROCesgdeCTPhb__sR8qrQi3oXoq1VHk5UYA4H-7YSSUkGJfp1GEa-CYLqCwyxveL8BwxvonqYrSftSUjgVFpmR23fnwnBpWySvdyXE_pnsUEsWjk7b9WIjI-fYgzrSvLqaZXUlJK88FZxe5DMDDeQKQZyE-w-U-k_GLKhrScQlnPtgLnCi12_3_W98vS4CihuJnMLz0kCYoH1SYv0WgWeOZS3D7UowJncgExbvxEwWNbcIGyvf9Owl_ijOUKgimIt7Jp6GNKi2d5j0jOR_LVLct05D1wQAkGeB0GBqIJ2OQ", + "e": "AQAB", + "d": "CafHUZudCawgqbx5hXkMDa98ZTPXM8oj_9yU3N_owUBx_3NNDV8j1vNrK9CKEE956gckpjg53IrLJ80LKPxbfJReWRKpl-BnvtVCe52mPrm7BYr0b311xA2pQPmXuzyH70ADtypyhg2nXKE8-j5loqJqQW5FEF9hIqg4uyB5HTCo9bvkZzRQsDtvdCcOGc6urUVtriFgUhVzbHNkQtsTSik4A-uXmJJACL_7665SK6SySKGEKeIZtwPOoeG9IUzVRsJjTO0-VMpwYi9YuZnc7_1RnrtnVOC4JbezhaxEiZNYujLr2X0GjugeHhniFBx-GJAzUm5o4BbSFm-2fLX7lQ", + "p": "1zZ26LTnHVtymxJOFa_AgAQd8gnFGtUtb8_RNhhzVHoT5RJV0FPcIpYS6cBzLAYWMmLwPqNWm70k_rH2aLk7y40asDhmMrX7C3_Hx4NuLDNQc9cy80Lfg7PYkoIOBztQPbfyc0kQSmplcfBRUkEU3088uIiuwSqu1LF5qvNJzy8", + "q": "w49hjlpmyrXwB6gUVmUxQtQXMacdVOHIi8hk3V1GtsY1uGjUYa2Su-IxzJIh6hCEgPrLceRuI0NKoTaFLtfLlJRsDjPr-dSP-REHz5BmH34IqVSH4ZkzbOl0yLnhPzJ6aBad6esrfvMebAxRT10CpSKcDa-7Y0tShnmCmycOdxc", + "dp": "F6nPbUrm1p2FfnOGzm-itPC-8iwM1iR2eILbOB18IN_DbD6V3PA7ljn2HmmgwEhzDFtAm0KOdVVYygB7XYxwfLMpKhMpeY306pDEQLW82XNS90nEOmcx-GM__uv56uWkrwSYzgBMoEIOoXaRGoA5cUxfGtM8k9TDoHNbM2bIyNU", + "dq": "JDpyuzl6I4GTBwgXRG4YsyWxakxoPapaSbMFJJE8IW4U06Xv-mx6a34a9af4ynDm6zIK8H19_eBgef8sqyHlIBBi-DqcM7syNNT32ncIxDrIBf6X8a48_ac-MFVnKhsC3DecZ5Jei3UkpKWfhpFXhRolSM_OajWxAyKNlIqmvl8", + "qi": "LMqZ-fRAfHi8CFgZseX5GYvcHfVq1e40WgCftrs9ntyTio5D4e6fw1GDGJphzVyaZ28EMOYCl-2flEkrvW3rr610XQ_0CzySU0dSxLVi15sfPdCP4qQYAjezKtFd05XTCOrnlOIU8VYp0ZehPfYrCwjqDi_TaazmcdCRp4PdMiw" + } + ] +} diff --git a/.docker/oathkeeper/rules.yaml b/.docker/oathkeeper/rules.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d52769c0004593de4e290657e49ab5d9e34de962 --- /dev/null +++ b/.docker/oathkeeper/rules.yaml @@ -0,0 +1,25 @@ +- id: holi + version: v0.38.25-beta.1 + upstream: + url: http://host.docker.internal:8000/ + match: + url: http://<127.0.0.1|localhost>:4455/<.*> + methods: + - GET + - HEAD + - POST + - PUT + - DELETE + - OPTIONS + - CONNECT + - TRACE + - PATCH + authenticators: + - handler: cookie_session + - handler: bearer_token + - handler: anonymous + authorizer: + handler: allow + mutators: + - handler: id_token + - handler: header diff --git a/docker-compose-full.yml b/docker-compose-full.yml index 54836085db382ccfb6ffd6ce7132e346b782ab37..24ddbfe07b77c4fb466ddab43fbaddd002ff62d9 100644 --- a/docker-compose-full.yml +++ b/docker-compose-full.yml @@ -10,11 +10,12 @@ services: extra_hosts: - db.okuna:172.16.16.4 - redis.okuna:172.16.16.5 + - oathkeeper.okuna:172.16.16.6 volumes: - ./:/opt/okuna-api - ./.docker-cache/pip:/root/.cache/pip ports: - - 80:80 + - 8000:80 working_dir: /opt/okuna-api networks: okuna: @@ -24,6 +25,7 @@ services: - redis env_file: - .docker-compose.env + hostname: webserver.okuna worker: container_name: okuna-worker build: @@ -66,6 +68,7 @@ services: - .docker-compose.env db: image: postgres:14.2-alpine + container_name: okuna-postgres hostname: db.okuna volumes: - postgres:/var/lib/postgresql/data @@ -79,6 +82,7 @@ services: - .docker-compose.env redis: image: bitnami/redis:latest + container_name: okuna-redis privileged: false ports: - 6379 @@ -89,6 +93,23 @@ services: - .docker-compose.env volumes: - redisdb:/bitnami/redis/data + oathkeeper: + container_name: okuna-oathkeeper + image: oryd/oathkeeper:latest + ports: + - 4455:4455 + - 4456:4456 + networks: + okuna: + ipv4_address: 172.16.16.6 + env_file: + - .docker-compose.env + volumes: + - ./.docker/oathkeeper:/opt/config + command: --config /opt/config/config.yaml serve + hostname: oathkeeper.okuna + extra_hosts: + - webserver.okuna:172.16.16.1 volumes: postgres: diff --git a/docker-compose-services-only.yml b/docker-compose-services-only.yml index f46a108934de3b636ff20416eee14053c4b2fd29..7f891ae16413387ba16f4935223b79ef1eeb73c6 100644 --- a/docker-compose-services-only.yml +++ b/docker-compose-services-only.yml @@ -45,6 +45,7 @@ services: - .docker-compose.env db: image: postgres:14.2-alpine + container_name: okuna-postgres hostname: db.okuna volumes: - postgres:/var/lib/postgresql/data @@ -58,6 +59,7 @@ services: - .docker-compose.env redis: image: bitnami/redis:latest + container_name: okuna-redis privileged: false ports: - 6380:6379 @@ -68,6 +70,20 @@ services: - .docker-compose.env volumes: - redisdb:/bitnami/redis/data + oathkeeper: + image: oryd/oathkeeper:latest + container_name: okuna-oathkeeper + ports: + - 4455:4455 + - 4456:4456 + networks: + okuna: + ipv4_address: 172.16.16.6 + env_file: + - .docker-compose.env + volumes: + - ./.docker/oathkeeper:/opt/config + command: --config /opt/config/config.yaml serve volumes: postgres: diff --git a/okuna-cli.py b/okuna-cli.py index cf7c340ec6bf407cf9dea1075dbd11a7c03195fa..42a2e750167a444f515706b42a12734ec576ce7b 100755 --- a/okuna-cli.py +++ b/okuna-cli.py @@ -314,7 +314,7 @@ def up_full(): subprocess.run(["docker-compose", "-f", "docker-compose-full.yml", "up", "-d", "-V"]) okuna_api_address = '127.0.0.1' - okuna_api_port = 80 + okuna_api_port = 8000 _wait_until_api_is_running(address=okuna_api_address, port=okuna_api_port) diff --git a/openbook/settings.py b/openbook/settings.py index feca2ab3d9d85c2b262a42761175ca3227f7b89e..df1814d1931d499298d76238346afeb9f29eb867 100644 --- a/openbook/settings.py +++ b/openbook/settings.py @@ -383,8 +383,8 @@ JWT_AUTH = { 'JWT_PAYLOAD_GET_USERNAME_HANDLER': 'openbook_auth.jwt.jwt_get_username_from_payload_handler', 'JWT_DECODE_HANDLER': 'openbook_auth.jwt.jwt_decode_token', 'JWT_ALGORITHM': 'RS256', - 'JWT_JWKS_URL': 'http://localhost:4456/.well-known/jwks.json', - 'JWT_ISSUER': 'http://localhost:4455/', + 'JWT_JWKS_URL': os.environ.get('JWT_JWKS_URL', 'http://localhost:4456/.well-known/jwks.json'), + 'JWT_ISSUER': os.environ.get('JWT_ISSUER', 'http://localhost:4456/'), 'JWT_AUDIENCE': 'https://project-holi.org/services/okuna/api', 'JWT_AUTH_HEADER_PREFIX': 'Bearer', } diff --git a/templates/.docker-compose.env b/templates/.docker-compose.env index b6875ad93619c47a7c5e89689ce26c5fb82289cd..66250c9e58905059ce9b37820d9a595088132576 100644 --- a/templates/.docker-compose.env +++ b/templates/.docker-compose.env @@ -100,4 +100,6 @@ POSTGRES_INITDB_ARGS='--encoding=UTF-8' # [REQUIRED] WAIT_HOSTS:db.okuna:5432 +JWT_JWKS_URL=http://oathkeeper.okuna:4456/.well-known/jwks.json +JWT_ISSUER=http://oathkeeper.okuna:4456/ # ============= END DOCKER COMPOSE SPECIFIC VARIABLES ============= # \ No newline at end of file