< Return to Summary | File Generated: Thu Apr 17 2025 12:26:37 GMT+0000 (Coordinated Universal Time)
Booking Flow:
Opportunity Type:
Feature: Authentication / Dynamic Client Registration for Multiple Seller Systems (Implemented)
Test: Authorization Code Flow
The Authorization Code Flow allows Sellers to authenticate with Booking Partners
npm start -- --runInBand test/features/authentication/dynamic-client-registration/implemented/authorization-code-flow-test.js
The OpenActive Reference Implementation test result for this test can be used as a reference to help with debugging.
✅ 8 passed with 0 failures, 0 warnings and 0 suggestions
The test suite is using Dynamic Client Registration to retrieve credentials as part of this test, using the following configuration within bookingPartnersForSpecificTests.dynamicPrimary.authentication
:
dynamic-primary-745ddf2d13019ce8b69c
Hence the client_id
and client_secret
can be found within the Dynamic Client Registration response below.
GET https://localhost:5003/.well-known/openid-configuration
"application/json"
"gzip, deflate, br"
"localhost:5003"
Response status code: 200.
{
"issuer": "https://localhost:5003",
"jwks_uri": "https://localhost:5003/.well-known/openid-configuration/jwks",
"authorization_endpoint": "https://localhost:5003/connect/authorize",
"token_endpoint": "https://localhost:5003/connect/token",
"userinfo_endpoint": "https://localhost:5003/connect/userinfo",
"end_session_endpoint": "https://localhost:5003/connect/endsession",
"check_session_iframe": "https://localhost:5003/connect/checksession",
"revocation_endpoint": "https://localhost:5003/connect/revocation",
"introspection_endpoint": "https://localhost:5003/connect/introspect",
"device_authorization_endpoint": "https://localhost:5003/connect/deviceauthorization",
"frontchannel_logout_supported": true,
"frontchannel_logout_session_supported": true,
"backchannel_logout_supported": true,
"backchannel_logout_session_supported": true,
"scopes_supported": [
"openid",
"openactive-identity",
"openactive-openbooking",
"openactive-ordersfeed",
"offline_access"
],
"claims_supported": [
"sub",
"https://openactive.io/sellerId",
"https://openactive.io/sellerName",
"https://openactive.io/sellerUrl",
"https://openactive.io/sellerLogo",
"https://openactive.io/bookingServiceName",
"https://openactive.io/bookingServiceUrl",
"name",
"https://openactive.io/clientId"
],
"grant_types_supported": [
"authorization_code",
"client_credentials",
"refresh_token",
"implicit",
"urn:ietf:params:oauth:grant-type:device_code"
],
"response_types_supported": [
"code",
"token",
"id_token",
"id_token token",
"code id_token",
"code token",
"code id_token token"
],
"response_modes_supported": [
"form_post",
"query",
"fragment"
],
"token_endpoint_auth_methods_supported": [
"client_secret_basic",
"client_secret_post"
],
"id_token_signing_alg_values_supported": [
"RS256"
],
"subject_types_supported": [
"public"
],
"code_challenge_methods_supported": [
"plain",
"S256"
],
"request_parameter_supported": true,
"registration_endpoint": "https://localhost:5003/connect/register"
}
POST https://localhost:5003/connect/register
"Bearer dynamic-primary-745ddf2d13019ce8b69c"
"application/json"
"application/json"
"413"
"gzip, deflate, br"
"localhost:5003"
{
"redirect_uris": [
"http://localhost:3000/cb"
],
"grant_types": [
"authorization_code",
"refresh_token",
"client_credentials"
],
"client_name": "OpenActive Test Suite Client",
"client_uri": "https://github.com/openactive/openactive-test-suite",
"logo_uri": "https://via.placeholder.com/512x256.png?text=Logo",
"scope": "openid profile openactive-openbooking openactive-ordersfeed oauth-dymamic-client-update openactive-identity"
}
Response status code: 201.
{
"client_id": "6a8e44e1-9f0a-47b8-928f-dab76f81686a",
"client_secret": "pXVKwV9I9h5loegttXzO4yiCD0QYUWk6LO6Hmz4GmkL",
"client_name": "OpenActive Test Suite Client",
"client_uri": "https://github.com/openactive/openactive-test-suite",
"initiate_login_uri": null,
"logo_uri": "https://via.placeholder.com/512x256.png?text=Logo",
"grant_types": [
"authorization_code",
"refresh_token",
"client_credentials"
],
"redirect_uris": [
"http://localhost:3000/cb"
],
"scope": "openid profile openactive-openbooking openactive-ordersfeed oauth-dymamic-client-update openactive-identity"
}
POST http://localhost:3000/browser-automation-for-auth
"application/json, text/plain, */*"
"application/json;charset=utf-8"
415
"localhost:3000"
{
"headless": true,
"offlineAccess": true,
"username": "test1",
"password": "test1",
"authorizationUrl": "https://localhost:5003/connect/authorize?client_id=6a8e44e1-9f0a-47b8-928f-dab76f81686a&scope=openid%20openactive-openbooking%20offline_access%20openactive-identity&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcb&code_challenge=620Qkj3sCZylxaZccqQi_M_4sacnQJmW_sZyN2qArJA&code_challenge_method=S256"
}
"https://localhost:5003/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3D6a8e44e1-9f0a-47b8-928f-dab76f81686a%26scope%3Dopenid%2520openactive-openbooking%2520offline_access%2520openactive-identity%26response_type%3Dcode%26redirect_uri%3Dhttp%253A%252F%252Flocalhost%253A3000%252Fcb%26code_challenge%3D620Qkj3sCZylxaZccqQi_M_4sacnQJmW_sZyN2qArJA%26code_challenge_method%3DS256"
"https://localhost:5003/consent?returnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3D6a8e44e1-9f0a-47b8-928f-dab76f81686a%26scope%3Dopenid%2520openactive-openbooking%2520offline_access%2520openactive-identity%26response_type%3Dcode%26redirect_uri%3Dhttp%253A%252F%252Flocalhost%253A3000%252Fcb%26code_challenge%3D620Qkj3sCZylxaZccqQi_M_4sacnQJmW_sZyN2qArJA%26code_challenge_method%3DS256"
"/cb?code=FAA60E2EFFAFB986F8F95AEE7A10E77C94394A95EE4FF51E20BB0F44061DE1BA&scope=openid%20openactive-openbooking%20offline_access%20openactive-identity&session_state=XoqimvzGaIGWPCEUZGIl6emuN8Cg0XS1PzRTxB1HT78.14FFFAC7D5BC5E0CAB3E25BBF3E940C5"
POST https://localhost:5003/connect/token
"Basic NmE4ZTQ0ZTEtOWYwYS00N2I4LTkyOGYtZGFiNzZmODE2ODZhOnBYVkt3VjlJOWg1bG9lZ3R0WHpPNHlpQ0QwUVlVV2s2TE82SG16NEdta0w="
"application/json"
"application/x-www-form-urlencoded"
"205"
"gzip, deflate, br"
"localhost:5003"
"grant_type=authorization_code&code=FAA60E2EFFAFB986F8F95AEE7A10E77C94394A95EE4FF51E20BB0F44061DE1BA&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcb&code_verifier=giH3s6DyFY6nbI7CuGZiXQGC5bmDxy6FnFAmvWIKV8E"
Response status code: 200.
{
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiSldUIn0.eyJuYmYiOjE3NDQ4OTI3OTksImV4cCI6MTc0NDg5MzA5OSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6IjZhOGU0NGUxLTlmMGEtNDdiOC05MjhmLWRhYjc2ZjgxNjg2YSIsImlhdCI6MTc0NDg5Mjc5OSwiYXRfaGFzaCI6ImVlZnZXNC1WUlpQRjFTNnNnMTV4VmciLCJzaWQiOiIwMkYwNTEwRUU1QjU0QUM5QzgzQTc1N0VCRDg3ODRGNSIsInN1YiI6IjEwMCIsImF1dGhfdGltZSI6MTc0NDg5Mjc5OCwiaWRwIjoibG9jYWwiLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVyTmFtZSI6IkFjbWUgRml0bmVzcyBMdGQiLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVySWQiOiJodHRwczovL2xvY2FsaG9zdDo1MDAxL2FwaS9pZGVudGlmaWVycy9zZWxsZXJzLzEiLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVyVXJsIjoiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20iLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVyTG9nbyI6Imh0dHBzOi8vcGxhY2VraXR0ZW4uY29tLzY0MC8zNjAiLCJhbXIiOlsicHdkIl19.GE3TP4tk8lTruDXMiC6m4bcQXs6FXuEHCsUneOjd4tCMDRhMgE3ce1JNC9cygnz1F_MbJ7ukr_ZAHAN3KOxEmWwdpdHV6iqQtZJ6Igih1y9gxFenaM8wStsdm3PfRw7zUIi0kKzIw4Ma3fYK3Ksu7vRBeOP8U0y_VCtZNrwednxi9zy__8km8b53IEL4VaU-Yt7cnohSsOcVKez6cwg4V1Q0V8Pi-c6aqp8ZaetJ9SA1CaVMwQT0g1gCCpyORSyYsIIoFyybfIdv4U7ePAYkmzpnyxQhaeUxPFSlXnmPGvJel-RTUXpUj0Z2Pp7lfG2xZykyBbmKJqczryGM4Kod9A",
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE3NDQ4OTI3OTksImV4cCI6MTc0NDg5NjM5OSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6Im9wZW5ib29raW5nIiwiY2xpZW50X2lkIjoiNmE4ZTQ0ZTEtOWYwYS00N2I4LTkyOGYtZGFiNzZmODE2ODZhIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL2NsaWVudElkIjoiNmE4ZTQ0ZTEtOWYwYS00N2I4LTkyOGYtZGFiNzZmODE2ODZhIiwic3ViIjoiMTAwIiwiYXV0aF90aW1lIjoxNzQ0ODkyNzk4LCJpZHAiOiJsb2NhbCIsImh0dHBzOi8vb3BlbmFjdGl2ZS5pby9zZWxsZXJJZCI6Imh0dHBzOi8vbG9jYWxob3N0OjUwMDEvYXBpL2lkZW50aWZpZXJzL3NlbGxlcnMvMSIsImp0aSI6IkYwNkE4N0YzRDg3RTJCRkZGMDA0NUM2NDhBMjdCNURFIiwic2lkIjoiMDJGMDUxMEVFNUI1NEFDOUM4M0E3NTdFQkQ4Nzg0RjUiLCJpYXQiOjE3NDQ4OTI3OTksInNjb3BlIjpbIm9wZW5pZCIsIm9wZW5hY3RpdmUtb3BlbmJvb2tpbmciLCJvcGVuYWN0aXZlLWlkZW50aXR5Iiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbInB3ZCJdfQ.p9yrJc2IKrM3b3VY_xg6gQxxiu8Q6PX2BnU6Z4YlS3EMDwjY3c-gwWncDNwVCKejMKISau5-Mz3RGbKU_dHv1DBDKOekLkapcjMGvaFxSSiHjQohAUoF8J1UyVs9COHsmqrRS2KbY070p8GWnXrfOcDqLt4iaHHEH1X_bpmhxXMXxovUyx53Jc2ePA04ZcNUbwDzvzoX94ypsqXvOl9alWcdOJb4phP0_s0xlnhHRy1TenOD7vdounmOzj_s785yqO0adNKDmuLiiDRxdbeqk6JJatTYcIXZ-Gx6-KB0KtjvZB_88ing7uN2avVTEEiSesroXdIAXmHmhamipKTYvA",
"expires_in": 3600,
"token_type": "Bearer",
"refresh_token": "C1B3D482B46EEE2EFAF78C3EF8D93400BBB7F67ABF53A680314FC7157701E953",
"scope": "openid openactive-openbooking offline_access openactive-identity"
}
GET https://localhost:5003/.well-known/openid-configuration/jwks
"application/json"
"gzip, deflate, br"
"localhost:5003"
Response status code: 200.
{
"keys": [
{
"kty": "RSA",
"use": "sig",
"kid": "B04F7B91DE3B9478C61833FB24AA5CDB",
"e": "AQAB",
"n": "yZO68vCGrvfBQ5R1z0DVCRAADOWeF3aLlhOaz1Je1SnmohmmlO-1F1hkRM_4MJtR5aECMxMz-MUW1nBCPmUrH0h_rrdCdDdlk8vTHki0ixK-gO73W2ZscOCZ6L2fZ2Oqz0_I840cnSCv55zpiOk9oGJL9TEsLAWYAIyQheaqZO3BkqImuBFmaLVTckvaZeONjHDQa01rxEjRQByir6oYSZPJy54XuRQJaPuCVNeOW8r0R9rKUQf9nl7tnVvhCsU3q1-UPrs8ZW_kaYXuYQJJMk392jX6XNm6czehIYM-O8Z5eGFdR3WW7IAWYEmqTCxrCRuuKU-EEcKOwksx8gBPgQ",
"alg": "RS256"
}
]
}
id_token
claims:
{
"nbf": 1744892799,
"exp": 1744893099,
"iss": "https://localhost:5003",
"aud": "6a8e44e1-9f0a-47b8-928f-dab76f81686a",
"iat": 1744892799,
"at_hash": "eefvW4-VRZPF1S6sg15xVg",
"sid": "02F0510EE5B54AC9C83A757EBD8784F5",
"sub": "100",
"auth_time": 1744892798,
"idp": "local",
"https://openactive.io/sellerName": "Acme Fitness Ltd",
"https://openactive.io/sellerId": "https://localhost:5001/api/identifiers/sellers/1",
"https://openactive.io/sellerUrl": "https://www.example.com",
"https://openactive.io/sellerLogo": "https://placekitten.com/640/360",
"amr": [
"pwd"
]
}
POST https://localhost:5003/connect/token
"Basic NmE4ZTQ0ZTEtOWYwYS00N2I4LTkyOGYtZGFiNzZmODE2ODZhOnBYVkt3VjlJOWg1bG9lZ3R0WHpPNHlpQ0QwUVlVV2s2TE82SG16NEdta0w="
"application/json"
"application/x-www-form-urlencoded"
"103"
"gzip, deflate, br"
"localhost:5003"
"grant_type=refresh_token&refresh_token=C1B3D482B46EEE2EFAF78C3EF8D93400BBB7F67ABF53A680314FC7157701E953"
Response status code: 200.
{
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiSldUIn0.eyJuYmYiOjE3NDQ4OTI3OTksImV4cCI6MTc0NDg5MzA5OSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6IjZhOGU0NGUxLTlmMGEtNDdiOC05MjhmLWRhYjc2ZjgxNjg2YSIsImlhdCI6MTc0NDg5Mjc5OSwiYXRfaGFzaCI6InZkRWp4ZFlpTDRHQjJ6TEpjQWY2cXciLCJzdWIiOiIxMDAiLCJhdXRoX3RpbWUiOjE3NDQ4OTI3OTgsImlkcCI6ImxvY2FsIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlck5hbWUiOiJBY21lIEZpdG5lc3MgTHRkIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlcklkIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMS9hcGkvaWRlbnRpZmllcnMvc2VsbGVycy8xIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlclVybCI6Imh0dHBzOi8vd3d3LmV4YW1wbGUuY29tIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlckxvZ28iOiJodHRwczovL3BsYWNla2l0dGVuLmNvbS82NDAvMzYwIiwiYW1yIjpbInB3ZCJdfQ.L7e5ED1Or_lIZRA_E9Z-8PxN-9zzaCNRjDrl_kr1MYNNI9DKQcEuXGmXGxoKWBCNcWiW3-8vPU45Svs0Cvg2WfNn77hfmkwhlHQPmbEjgjca8adKqmVm_3ENcb4ZhlMdL1UtxRQLR2aYl565cbG9P4_X7s91Jq665kvWyLiDxvqoHgUTL7edsjRy36BlgWvzB5qBvlZFZ7aEKU3xJK6g7jf20K9Nr2vdg4as5qlUVf1XKRgG32HuoVqVa0LawLOgM9-Z2RL6U150OZbgZSBdjCF4hXxHnxYndkdiYtGP2XW-8y9jHXYzGAbIsUPn-IyaACRCoDPdo1u5-RzLm_G1eQ",
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE3NDQ4OTI3OTksImV4cCI6MTc0NDg5NjM5OSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6Im9wZW5ib29raW5nIiwiY2xpZW50X2lkIjoiNmE4ZTQ0ZTEtOWYwYS00N2I4LTkyOGYtZGFiNzZmODE2ODZhIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL2NsaWVudElkIjoiNmE4ZTQ0ZTEtOWYwYS00N2I4LTkyOGYtZGFiNzZmODE2ODZhIiwic3ViIjoiMTAwIiwiYXV0aF90aW1lIjoxNzQ0ODkyNzk4LCJpZHAiOiJsb2NhbCIsImh0dHBzOi8vb3BlbmFjdGl2ZS5pby9zZWxsZXJJZCI6Imh0dHBzOi8vbG9jYWxob3N0OjUwMDEvYXBpL2lkZW50aWZpZXJzL3NlbGxlcnMvMSIsImp0aSI6IjI1QThGOTA3QzUwODUyRTFBMEFFREIxMENEQ0M5NzY3IiwiaWF0IjoxNzQ0ODkyNzk5LCJzY29wZSI6WyJvcGVuaWQiLCJvcGVuYWN0aXZlLW9wZW5ib29raW5nIiwib3BlbmFjdGl2ZS1pZGVudGl0eSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJwd2QiXX0.gqP1kIqF7JEhC4VCPWr7TdGneRB38vigBtymhAKXgxvhGxB2yPaw2PcLifLjCYTlXT3RG6igcNhh7zM3K_pNMY9m_08OrXdj5ahbxSl53JfUvCj_2oaT7b57UTy-4e0mDsrEDCOmNy-SQtgVusq7xTEYvM5Ln5QwUqUydzbK-75zt1bJelSvrFdW8qcQd_kg3WggEtG8o3BdiQjYnfDrvnTTOl7U_PI_ntFVplABR-OdLPspgpIDsBpAc6YvfRGqT7R8HxlR3rQhnQI7CTdht13TLSGdNoJ3kmDWJu1o2d1g8TpvTvABAF9bLOI6sqKM0PmEYxwdxy8ArJWfKd4M0A",
"expires_in": 3600,
"token_type": "Bearer",
"refresh_token": "6B4168B08DF1404D8C61DCE46F98A75C4F4835F0D4FBD9486EC559021FFFE876",
"scope": "openid openactive-openbooking openactive-identity offline_access"
}
https://openactive.io/sellerId
claim in id_token
id_token
as defined in specification