< Return to Summary | File Generated: Thu Apr 17 2025 12:28:29 GMT+0000 (Coordinated Universal Time)
Booking Flow:
Opportunity Type:
Feature: Authentication / Booking Partner OpenID Authentication 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/booking-partner-openid-authentication-for-multiple-sellers/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.
✅ 6 passed with 0 failures, 0 warnings and 0 suggestions
The test suite is using the credentials below for this test:
dddc08d3-8c40-48bc-b4b9-45fd330e1c6bjxHW6hXQWSKN0WjmbTzszwcnYg0wAvMEguWaXK2MCfQThese credentials were retrieved using Dynamic Client Registration by the Broker Microservice upon startup, using the following configuration within bookingPartners.primary.authentication:
openactive_test_suite_client_12345xaqGET 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 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=dddc08d3-8c40-48bc-b4b9-45fd330e1c6b&scope=openid%20openactive-openbooking%20offline_access%20openactive-identity&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcb&code_challenge=rK3rGGK5CIvyzUOAquuIx8nuUc3ZuHI3BDLMRSqT7BI&code_challenge_method=S256"
}
"https://localhost:5003/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3Ddddc08d3-8c40-48bc-b4b9-45fd330e1c6b%26scope%3Dopenid%2520openactive-openbooking%2520offline_access%2520openactive-identity%26response_type%3Dcode%26redirect_uri%3Dhttp%253A%252F%252Flocalhost%253A3000%252Fcb%26code_challenge%3DrK3rGGK5CIvyzUOAquuIx8nuUc3ZuHI3BDLMRSqT7BI%26code_challenge_method%3DS256"
"https://localhost:5003/consent?returnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3Ddddc08d3-8c40-48bc-b4b9-45fd330e1c6b%26scope%3Dopenid%2520openactive-openbooking%2520offline_access%2520openactive-identity%26response_type%3Dcode%26redirect_uri%3Dhttp%253A%252F%252Flocalhost%253A3000%252Fcb%26code_challenge%3DrK3rGGK5CIvyzUOAquuIx8nuUc3ZuHI3BDLMRSqT7BI%26code_challenge_method%3DS256"
"/cb?code=5CCB4885ED7F6F8005FC36FA46C4AF74BC11DC744162CA42DD22AF3BECAADAC7&scope=openid%20openactive-openbooking%20offline_access%20openactive-identity&session_state=fpK-uFClHgo-8Bf8z1D0d8WpOA5tO73dGez6wV4ncDU.3102C8627C7C66146CCA20D5E3162C50"
POST https://localhost:5003/connect/token
"Basic ZGRkYzA4ZDMtOGM0MC00OGJjLWI0YjktNDVmZDMzMGUxYzZiOmp4SFc2aFhRV1NLTjBXam1iVHpzendjbllnMHdBdk1FZ3VXYVhLMk1DZlE=""application/json""application/x-www-form-urlencoded""205""gzip, deflate, br""localhost:5003""grant_type=authorization_code&code=5CCB4885ED7F6F8005FC36FA46C4AF74BC11DC744162CA42DD22AF3BECAADAC7&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcb&code_verifier=bsMtpg7aWoZxmEya7WqHE_yYnFMul6DfYXOSuehURcw"
Response status code: 200.
{
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiSldUIn0.eyJuYmYiOjE3NDQ4OTI5MTAsImV4cCI6MTc0NDg5MzIxMCwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6ImRkZGMwOGQzLThjNDAtNDhiYy1iNGI5LTQ1ZmQzMzBlMWM2YiIsImlhdCI6MTc0NDg5MjkxMCwiYXRfaGFzaCI6Im1rOFgxdmlEOWl6aXRELVlXRVpKV1EiLCJzaWQiOiIxOTYwNzZEODI2NjY5NTFCQ0NFRDY4NzA5RDQ4M0YzNSIsInN1YiI6IjEwMCIsImF1dGhfdGltZSI6MTc0NDg5MjkxMCwiaWRwIjoibG9jYWwiLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVyTmFtZSI6IkFjbWUgRml0bmVzcyBMdGQiLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVySWQiOiJodHRwczovL2xvY2FsaG9zdDo1MDAxL2FwaS9pZGVudGlmaWVycy9zZWxsZXJzLzEiLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVyVXJsIjoiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20iLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVyTG9nbyI6Imh0dHBzOi8vcGxhY2VraXR0ZW4uY29tLzY0MC8zNjAiLCJhbXIiOlsicHdkIl19.CL5OUFyB7CAy_nkcb7Vw9lC5C_qNlvNEXJOuKanEarp9n8MernFCH44gz7YLh9sNtPGg85720hBzegX99A9F1hPhO0xBT41hTB-dvcHF0r6l1JvOLqMAfQ4tFpcJa7775XFdnnOkq6F_HAWPAe1NVgLspdxVb-oHJdBReqY28mQLqJ8Nkwemo7D6GMPICt2rhxehZXHmu5dLxmZoW6lGdk-lY0OuOmDAsIkF5thyWr0us9zO2ypyQ0T3dh-A53PPXjv1U6hcYXhVE0p9EWcB1xtL9pYl3tbx7RmPPj1qpoO4IqlZm2stPosMwJ86NIb-rGVmAtQY5NADCpzU5TjSQw",
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE3NDQ4OTI5MTAsImV4cCI6MTc0NDg5NjUxMCwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6Im9wZW5ib29raW5nIiwiY2xpZW50X2lkIjoiZGRkYzA4ZDMtOGM0MC00OGJjLWI0YjktNDVmZDMzMGUxYzZiIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL2NsaWVudElkIjoiZGRkYzA4ZDMtOGM0MC00OGJjLWI0YjktNDVmZDMzMGUxYzZiIiwic3ViIjoiMTAwIiwiYXV0aF90aW1lIjoxNzQ0ODkyOTEwLCJpZHAiOiJsb2NhbCIsImh0dHBzOi8vb3BlbmFjdGl2ZS5pby9zZWxsZXJJZCI6Imh0dHBzOi8vbG9jYWxob3N0OjUwMDEvYXBpL2lkZW50aWZpZXJzL3NlbGxlcnMvMSIsImp0aSI6IkI0N0MxQTYyMzg0RkQ1QjFBMzU3OTVEQUIwODBBNTlGIiwic2lkIjoiMTk2MDc2RDgyNjY2OTUxQkNDRUQ2ODcwOUQ0ODNGMzUiLCJpYXQiOjE3NDQ4OTI5MTAsInNjb3BlIjpbIm9wZW5pZCIsIm9wZW5hY3RpdmUtb3BlbmJvb2tpbmciLCJvcGVuYWN0aXZlLWlkZW50aXR5Iiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbInB3ZCJdfQ.F1KLt0mvfXp3skB56WRUu1GjbuyzAdCfVp7Gicj5cq9fHPjep8lVa9WbtFBox1nVF4F0kBwUuv30eS6mWOQQsYV7SqyzHrttxW3jPuHC4Vy1MX6zPlMG8BdwWXi98aRE2cyimlNFTJn7UDDSIoHeXCj77vcm3_ooOh_faGTiq3ZR6xKemCdTzrYCygto8Z76t9PXd5CzMAoESUqLeGZKWAEFP3tr49tAGmLQ__zRCL8M0cFjlm4uNgQwL2WsF_1sLoFi8-u_Se6LgIyZj3NySwNG_AvP58WMI9Hulwwhldp0Vk4vWZyQywMTS-oJlPhZrOUad_3tdtblAseOOirlOA",
"expires_in": 3600,
"token_type": "Bearer",
"refresh_token": "EB820B6463103FC92AE240F599C6FE90EEFEB231AAE7535180B2EB713468D35C",
"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": 1744892910,
"exp": 1744893210,
"iss": "https://localhost:5003",
"aud": "dddc08d3-8c40-48bc-b4b9-45fd330e1c6b",
"iat": 1744892910,
"at_hash": "mk8X1viD9izitD-YWEZJWQ",
"sid": "196076D82666951BCCED68709D483F35",
"sub": "100",
"auth_time": 1744892910,
"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 ZGRkYzA4ZDMtOGM0MC00OGJjLWI0YjktNDVmZDMzMGUxYzZiOmp4SFc2aFhRV1NLTjBXam1iVHpzendjbllnMHdBdk1FZ3VXYVhLMk1DZlE=""application/json""application/x-www-form-urlencoded""103""gzip, deflate, br""localhost:5003""grant_type=refresh_token&refresh_token=EB820B6463103FC92AE240F599C6FE90EEFEB231AAE7535180B2EB713468D35C"
Response status code: 200.
{
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiSldUIn0.eyJuYmYiOjE3NDQ4OTI5MTEsImV4cCI6MTc0NDg5MzIxMSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6ImRkZGMwOGQzLThjNDAtNDhiYy1iNGI5LTQ1ZmQzMzBlMWM2YiIsImlhdCI6MTc0NDg5MjkxMSwiYXRfaGFzaCI6ImR2QnlFdVROZFAxOF9PcTlQempYQlEiLCJzdWIiOiIxMDAiLCJhdXRoX3RpbWUiOjE3NDQ4OTI5MTAsImlkcCI6ImxvY2FsIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlck5hbWUiOiJBY21lIEZpdG5lc3MgTHRkIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlcklkIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMS9hcGkvaWRlbnRpZmllcnMvc2VsbGVycy8xIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlclVybCI6Imh0dHBzOi8vd3d3LmV4YW1wbGUuY29tIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlckxvZ28iOiJodHRwczovL3BsYWNla2l0dGVuLmNvbS82NDAvMzYwIiwiYW1yIjpbInB3ZCJdfQ.hpH5MItU1BR-MyXKod9C2v8LCgaI_lNNSFO4IinRhFnuFhX_wnPni5PRisL8tL4Yfc7VoPcHrvOV_I1x8oMb8b_MbfbqHfwmiNg8AxfohVXA9hPXziAK0auOIZQnCYu4odAiE4IGagq1kVfGVKcaxEEfP-KHN7gl-WqYV0zOkI3R2zcn2O0TVboJpa-dyFDxiEtSrmA33cCl1yWhHwOGkFN3ihqzo1i95Zd1Da5EXjech7DTxkrzPq_fY7f01lBENBjlsd3Avc_Rc6o7LSANgFj6VRrPR2umraWVBKNSi5zrGBF2j1LaG3ZF_-pMz5y1XdyCacFupAaR2YkMNwQbZQ",
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE3NDQ4OTI5MTEsImV4cCI6MTc0NDg5NjUxMSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6Im9wZW5ib29raW5nIiwiY2xpZW50X2lkIjoiZGRkYzA4ZDMtOGM0MC00OGJjLWI0YjktNDVmZDMzMGUxYzZiIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL2NsaWVudElkIjoiZGRkYzA4ZDMtOGM0MC00OGJjLWI0YjktNDVmZDMzMGUxYzZiIiwic3ViIjoiMTAwIiwiYXV0aF90aW1lIjoxNzQ0ODkyOTEwLCJpZHAiOiJsb2NhbCIsImh0dHBzOi8vb3BlbmFjdGl2ZS5pby9zZWxsZXJJZCI6Imh0dHBzOi8vbG9jYWxob3N0OjUwMDEvYXBpL2lkZW50aWZpZXJzL3NlbGxlcnMvMSIsImp0aSI6IjlCODYxMDgxQzI5MzNERjhDRUI4MUI4OEI3M0JEMEZFIiwiaWF0IjoxNzQ0ODkyOTExLCJzY29wZSI6WyJvcGVuaWQiLCJvcGVuYWN0aXZlLW9wZW5ib29raW5nIiwib3BlbmFjdGl2ZS1pZGVudGl0eSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJwd2QiXX0.bPXeyxTR77Pqjx-MaLXYapuDY4KXnQQ_JXbB20jLY6TUsNjNJf_UUEsbZ7ep04KDgBDaN-zFTvnb4oZfbqzacPrTxlsqkAT4xce38c5rnyVXxdb72MNRQzTFMJC5WxQA-zPxPDq2X7zlAGVbQKInNbaZXOQTqdT8DCTn6Hng_vwGCi4Fq_i6ACXsObfKyb7Mk9Df7BgciegnaJ3pUc_HExAHzx4mMRMHgGI-hjLXBu3xNhXe5nGKfYtjFeFxdmYGw5AQh3uKjprDK00sPUwOE2AGounpdkJ9K8Q2tt0MEJyb_FtQGC45kbrGOo-A9TebBNdSZzXcT-SubnqPcR4RPg",
"expires_in": 3600,
"token_type": "Bearer",
"refresh_token": "9140DA4521A45E42F3B3E42E1A32752DB226A7BC19AEC3452480DA3D3448D30D",
"scope": "openid openactive-openbooking openactive-identity offline_access"
}
https://openactive.io/sellerId claim in id_tokenid_token as defined in specification