< Return to Summary | File Generated: Thu May 09 2024 14:52:37 GMT+0000 (Coordinated Universal Time)

booking-partner-authentication >> authorization-code-flow

Booking Flow:

Opportunity Type:

Feature: Authentication / Booking Partner Authentication for Multiple Seller Systems (Implemented)

Test: Authorization Code Flow

The Authorization Code Flow allows Sellers to authenticate with Booking Partners

Running only this test

npm start -- --runInBand test/features/authentication/booking-partner-authentication/implemented/authorization-code-flow-test.js

Is this test failing?

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


✅ Open ID Connect Authentication

Credentials

The test suite is using the credentials below for this test:

These credentials were retrieved using Dynamic Client Registration by the Broker Microservice upon startup, using the following configuration within bookingPartners.primary.authentication:

Discovery Request

GET https://localhost:5003/.well-known/openid-configuration


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"
}

Authorization Code Flow - 1 Request

POST http://localhost:3000/browser-automation-for-auth

{
  "headless": true,
  "offlineAccess": true,
  "username": "test1",
  "password": "test1",
  "authorizationUrl": "https://localhost:5003/connect/authorize?client_id=687efb5d-e28e-41c3-a422-82c08d8554ee&scope=openid%20openactive-openbooking%20offline_access%20openactive-identity&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcb&code_challenge=79-uUCva6fkkE3LNYrTaK7pC9sJWJsuuD1A4V2Q21lc&code_challenge_method=S256"
}

Screenshot: Login page

"https://localhost:5003/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3D687efb5d-e28e-41c3-a422-82c08d8554ee%26scope%3Dopenid%2520openactive-openbooking%2520offline_access%2520openactive-identity%26response_type%3Dcode%26redirect_uri%3Dhttp%253A%252F%252Flocalhost%253A3000%252Fcb%26code_challenge%3D79-uUCva6fkkE3LNYrTaK7pC9sJWJsuuD1A4V2Q21lc%26code_challenge_method%3DS256"

Screenshot: Login page

Screenshot: Authorization page

"https://localhost:5003/consent?returnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3D687efb5d-e28e-41c3-a422-82c08d8554ee%26scope%3Dopenid%2520openactive-openbooking%2520offline_access%2520openactive-identity%26response_type%3Dcode%26redirect_uri%3Dhttp%253A%252F%252Flocalhost%253A3000%252Fcb%26code_challenge%3D79-uUCva6fkkE3LNYrTaK7pC9sJWJsuuD1A4V2Q21lc%26code_challenge_method%3DS256"

Screenshot: Authorization page

Callback URL

"/cb?code=22EC98304CCFBE99573A1AFFB859F100FE0E30874E2F6A2A5F0FC8F9FE1C0C9E&scope=openid%20openactive-openbooking%20offline_access%20openactive-identity&session_state=EkP-cag9LBw7Yc-A9wFERyueGW78y6i5DakJ8NcXMXY.9B6D0B5E2C97F4675AC186998005455A"

Authorization Code Flow - 2 Request

POST https://localhost:5003/connect/token

"grant_type=authorization_code&code=22EC98304CCFBE99573A1AFFB859F100FE0E30874E2F6A2A5F0FC8F9FE1C0C9E&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcb&code_verifier=7ZTo1jLIRoATYphJR_6aEbrqofxu9_Sn-ie4iMZVYx0"

Response status code: 200.

{
  "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiSldUIn0.eyJuYmYiOjE3MTUyNjYzNTksImV4cCI6MTcxNTI2NjY1OSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6IjY4N2VmYjVkLWUyOGUtNDFjMy1hNDIyLTgyYzA4ZDg1NTRlZSIsImlhdCI6MTcxNTI2NjM1OSwiYXRfaGFzaCI6InVsZnZoRjdmY3Uzb2gxaC1mekcyVEEiLCJzaWQiOiIxQzc1M0UxMUJDNTMyQUUwMUE5MTA2OUEwODdGNDlCRSIsInN1YiI6IjEwMCIsImF1dGhfdGltZSI6MTcxNTI2NjM1OCwiaWRwIjoibG9jYWwiLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVyTmFtZSI6IkFjbWUgRml0bmVzcyBMdGQiLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVySWQiOiJodHRwczovL2xvY2FsaG9zdDo1MDAxL2FwaS9pZGVudGlmaWVycy9zZWxsZXJzLzEiLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVyVXJsIjoiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20iLCJodHRwczovL29wZW5hY3RpdmUuaW8vc2VsbGVyTG9nbyI6Imh0dHBzOi8vcGxhY2VraXR0ZW4uY29tLzY0MC8zNjAiLCJhbXIiOlsicHdkIl19.Roapz-M1MlqH8wqSs8-64wDMf08M33pF6_jg_ai-0U5NrQGo4TDhO2yWxyFC-nA2kc3tbvJbJLoZzs7Xu00lrbp0jvDMRzuw8sD1jN0qYNG2RoAv-oGd4FvHYwgILaPHxjOFy_mTTvnLC3NPo9vq1PPURLprfOfNZU0moExypH8Y9IIdn5n_4crY2kv9cLJxhfH-zqgEKKWrxiMiuNNJKzwtkpXb4Sq_240BGVCYwxt4Lnrcu9uh1mAvb5ArvKYR-FiP83lFRSldkB9W8J78B8q7jGomi3BLsSf0E3vJAsHR_YY9Wt2LRVgi3rNknnZwJR-vpdi2H33lrH6GDN4ekw",
  "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE3MTUyNjYzNTksImV4cCI6MTcxNTI2OTk1OSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6Im9wZW5ib29raW5nIiwiY2xpZW50X2lkIjoiNjg3ZWZiNWQtZTI4ZS00MWMzLWE0MjItODJjMDhkODU1NGVlIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL2NsaWVudElkIjoiNjg3ZWZiNWQtZTI4ZS00MWMzLWE0MjItODJjMDhkODU1NGVlIiwic3ViIjoiMTAwIiwiYXV0aF90aW1lIjoxNzE1MjY2MzU4LCJpZHAiOiJsb2NhbCIsImh0dHBzOi8vb3BlbmFjdGl2ZS5pby9zZWxsZXJJZCI6Imh0dHBzOi8vbG9jYWxob3N0OjUwMDEvYXBpL2lkZW50aWZpZXJzL3NlbGxlcnMvMSIsImp0aSI6IjVCOTA4MDQxNjc1N0M4NTBGNUY2NEM2NEZDMDU3NERCIiwic2lkIjoiMUM3NTNFMTFCQzUzMkFFMDFBOTEwNjlBMDg3RjQ5QkUiLCJpYXQiOjE3MTUyNjYzNTksInNjb3BlIjpbIm9wZW5pZCIsIm9wZW5hY3RpdmUtb3BlbmJvb2tpbmciLCJvcGVuYWN0aXZlLWlkZW50aXR5Iiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbInB3ZCJdfQ.TZ9VPK-xOrALHX_UkBTHunzAzV0zkQkTlY7ynrF1UQ5QaXB1njQgZ-hnMLgFP2c8fSPJkuuGmG_ctjlVxy7MB0bwvvKi2khHqfwBxH-vr8IBkOsUYw0K5ybmlzCl5pCtwtPJunnbjhdnCyza33xXF7OMoowvuoGNrUuuW8shLTj-vRuDt71pIdd-z52NOFAnk16BInIVbSmfI7KMxqOme-A0U5ejsfGcc3hByoGye53wPqUCQCB5p36OZODbw7GEEizEu8_i6PQP4F-jzu9ptku102Y1KcX2m46ob_eMW7Z7SY2YFRtOO4TBPK03xH5bE-4WEfG11v9zz0SR80fzFA",
  "expires_in": 3600,
  "token_type": "Bearer",
  "refresh_token": "4CF0AB5EFB37A4C5ADC007B7FB7F6F031F900FD4323285EDE62257E1CBE8EDE6",
  "scope": "openid openactive-openbooking offline_access openactive-identity"
}

Authorization Code Flow - 3 Request

GET https://localhost:5003/.well-known/openid-configuration/jwks


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"
    }
  ]
}

Authorization Code Flow - Claims Result

id_token claims:

{
  "nbf": 1715266359,
  "exp": 1715266659,
  "iss": "https://localhost:5003",
  "aud": "687efb5d-e28e-41c3-a422-82c08d8554ee",
  "iat": 1715266359,
  "at_hash": "ulfvhF7fcu3oh1h-fzG2TA",
  "sid": "1C753E11BC532AE01A91069A087F49BE",
  "sub": "100",
  "auth_time": 1715266358,
  "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"
  ]
}

Refresh Token Request

POST https://localhost:5003/connect/token

"grant_type=refresh_token&refresh_token=4CF0AB5EFB37A4C5ADC007B7FB7F6F031F900FD4323285EDE62257E1CBE8EDE6"

Response status code: 200.

{
  "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiSldUIn0.eyJuYmYiOjE3MTUyNjYzNTksImV4cCI6MTcxNTI2NjY1OSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6IjY4N2VmYjVkLWUyOGUtNDFjMy1hNDIyLTgyYzA4ZDg1NTRlZSIsImlhdCI6MTcxNTI2NjM1OSwiYXRfaGFzaCI6IklSSGxHR1JsOHBVWGpueDJxdVJJRHciLCJzdWIiOiIxMDAiLCJhdXRoX3RpbWUiOjE3MTUyNjYzNTgsImlkcCI6ImxvY2FsIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlck5hbWUiOiJBY21lIEZpdG5lc3MgTHRkIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlcklkIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMS9hcGkvaWRlbnRpZmllcnMvc2VsbGVycy8xIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlclVybCI6Imh0dHBzOi8vd3d3LmV4YW1wbGUuY29tIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL3NlbGxlckxvZ28iOiJodHRwczovL3BsYWNla2l0dGVuLmNvbS82NDAvMzYwIiwiYW1yIjpbInB3ZCJdfQ.VZ9s7iak893MOZ-VT65ZhPb-jPHrxVF6qs7OHgx9Iy4-cVkz4FDgVZ4OfDuYPeeIAcNhORIeL6BaN5DobAdy37mjhNl3vYqXJFbL-8zxKAmSInmkt_d93xSd7ZpgqYYxfjSXB8ze1_mf8S4yZ2YbeHwuiUnJt4NFt2-CdAOFyvlYDWnf9UShlV-76D4u6Pzjzca8H_waju86UeBmc-U5QHUmoFIXk2QuivxNTJ_6tRHkb6MaX2A772NjX6a-j5GIkBBazk-XLD3sSd8yS6-Kk_2q_4IiR3Idyd0IErENCCPf8WaVi48kqpYUy51zdaE6t8uv3UjZZMmXVMQBO9smXA",
  "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkIwNEY3QjkxREUzQjk0NzhDNjE4MzNGQjI0QUE1Q0RCIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE3MTUyNjYzNTksImV4cCI6MTcxNTI2OTk1OSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMyIsImF1ZCI6Im9wZW5ib29raW5nIiwiY2xpZW50X2lkIjoiNjg3ZWZiNWQtZTI4ZS00MWMzLWE0MjItODJjMDhkODU1NGVlIiwiaHR0cHM6Ly9vcGVuYWN0aXZlLmlvL2NsaWVudElkIjoiNjg3ZWZiNWQtZTI4ZS00MWMzLWE0MjItODJjMDhkODU1NGVlIiwic3ViIjoiMTAwIiwiYXV0aF90aW1lIjoxNzE1MjY2MzU4LCJpZHAiOiJsb2NhbCIsImh0dHBzOi8vb3BlbmFjdGl2ZS5pby9zZWxsZXJJZCI6Imh0dHBzOi8vbG9jYWxob3N0OjUwMDEvYXBpL2lkZW50aWZpZXJzL3NlbGxlcnMvMSIsImp0aSI6IjA1M0Y5Q0QwNTg0NkQxMkY0OTFBOTIyRjc1Nzg2MDI2IiwiaWF0IjoxNzE1MjY2MzU5LCJzY29wZSI6WyJvcGVuaWQiLCJvcGVuYWN0aXZlLW9wZW5ib29raW5nIiwib3BlbmFjdGl2ZS1pZGVudGl0eSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJwd2QiXX0.HPvYHXTxFNj8XLVkEcRfziKPkhVRCrWyzMer0vuYIQKbfGUUiAVGNC4Ylj2DbkDJRMNzMe7ajTiGqQrD-zC7JyPQ6_NXPZNk2InNvDQGsIGouhBCKiHdOAXd7OSMkRI2SAHx5GdVzA1e1wrYIhcmKHFO6wVRe648_dL4Cx9gKv93nJIuzJ3W5AmAFZ9xZXjCPQfYsQ0ZCHPbh5TX0CNDKyfsZze1wtUYSyj5H2mjf8eAtyjubuNPWd6tkeOxti3Mq_Y7aqbnXNac-ExlVdY_t2CrS8307cKshDnYtgLdESSr0Ilg_TsRkc9DvK-JsWKl02St6K-ke_A49q9lbmUqMA",
  "expires_in": 3600,
  "token_type": "Bearer",
  "refresh_token": "3B28EE847A1206EF30D2DC66E0CAE8279920AD91640986CDA0DA7DE53CFFF0DB",
  "scope": "openid openactive-openbooking openactive-identity offline_access"
}

Specs