Switchfly OAuth 2 - SSO Authorize API

Switchfly OAuth 2 SSO request to 3rd party

OpenAPI Specification

switchfly-oauth-2-sso-authorize-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Switchfly Loyalty Machine to Machine (OAuth2 & Refund) Machine to Machine (OAuth2 & Refund) OAuth 2 - SSO Authorize API
  description: "Switchfly uses **OAuth 2** for the SSO authentication required to communicate with any 3rd party API in order to perform loyalty account actions.\nThe grant types supported are:\n\n- **client_credentials**\n- **authorization_code (with PKCE)**\n\nThis flexibility allows clients to seamlessly integrate with our platform. For instance, some clients may already possess\na form of Single Sign-On (SSO) \"token\" utilized internally for various actions concerning loyalty users,\nsuch as fetching profiles, redeeming rewards.\n\nIn such scenarios, adopting the `client_credentials` **grant type** flow could be a more logical choice for initiating Single Sign-On (SSO).\nThis approach enables third parties to consolidate authorization by leveraging parameters such as **client_id** and **client_secret** to acquire an access token.\nThis token operating as a Bearer token, can then be utilized alongside the internal \"token\" within any requests.\n\nFor this flow it will be required for the client to pass that token as a `UserToken` param into Switchfly's SSO endpoint. \n\nIf there is no such thing as a user `token` in the client internal SSO implementation `authorization_code` **grant type** will be the other option for the SSO integration.\n\nAfter any of the OAuth2 flows is completed Switchfly will gain access to any the following credentials:\n- `access_token`\n- `refresh_token` (only required on **Authorization Code** grant type)\n- `UserToken` (only required on **Client Credentials Code** grant type, sent by 3rd party client in SSO request)\n\nOnce this SSO step is completed Switchfly will be able to communicate with a client hosted API capable providing traveler profile information and\nredeeming points.\n\n# Initiate SSO against Switchfly\nIn this section, we will outline the SSO shopping flow for each supported grant type, detailing the endpoints in place.\nAdditionally, we will specify the circumstances under which each API call mentioned in this documentation will be utilized.\n\n## Authorization Code SSO\n\nWhen a third party opts to integrate with Switchfly using the authorization code, our application must initially generate the `code_challenge` data to commence the OAuth2 flow.\nConsequently, it becomes necessary for the third party to initiate navigation to the Switchfly site.\n\nThis implies that within the third-party website, a redirect mechanism must be implemented. This implementation will initially transition the user to the Switchfly site at `https://[domain].switchfly.com/`.\n\nAfter this Switchfly will detect that there is no loyalty session established yet and will generate a `code_challenge` and redirect the user to the specified client provided\n`/authorize` endpoint specifying the `redirect_uri`.\n\nThis `redirect_uri` will be the endpoint capable of receiving the authorization code, that's `https://[domain].switchfly.com/apps/api/sso/oauth2` \n\nFollowing the user's login on the client login form, upon successful authentication, the third-party system is anticipated to send back the authorization code to the aforementioned `redirect_uri`.\n\nOnce Switchfly receives the authorization code it will be used to obtain `access_token` & `refresh_token`.\n\nAfter being able to fetch the tokens Switchfly will perform a request to the provided `/traveler-profile` using the `access_token` as a Authorization Bearer token, which will provide\nback a `TravelerProfile` response back to our system which then will be parsed to SSO the customer into our system.\n\nSwitchfly will present the customer a search form from which the customer can proceed to look for any desired products.\n\nDuring the checkout products process Switchfly will perform a request to the provided `/redeem` endpoint to send the 3rd party system the details about the points redemption\nperformed by the customer and the products being purchased.\n\nDuring the shopping flow on long sessions there will be some keep alive requests (`grant_type=refresh_token`) used to obtain new tokens to allow the user to book once they are ready.\n\n## Flow Steps\n\n- Navigate to the Switchfly site.\n- Redirect to the client's `/authorize` endpoint.\n- Log in with customer credentials.\n- Send the code to Switchfly's `/apps/api/sso/oauth2`.\n- Request a token from the client's `/token` endpoint.\n- Request a profile from the client's `/traveler-profile` endpoint.\n- During checkout, send a request to the client's `/redeem` endpoint.\n- Conditionally, refresh token requests to `/token`.\n\n## Client Credentials SSO\n\nWhen a 3rd party chooses to integrate with Switchfly using client credentials the 3rd party is only required to perform a request to Switchfly OAuth2 endpoint providing the \"**token**\" as a parameter\n\"**userToken**\".\n\n`https://[domain].switchfly.com/apps/api/sso/oauth2` post parameter `\"userToken\"=[internal_token]`\n\nOnce Switchfly receives this token from the 3rd party it will obtain an `access_token` using the provided `client_id` & `client_secret`.\n\nAfter being table to retrieve a token Switchfly will perform a request to the provided `/traveler-profile` endpoint sending the following headers:\n- Authorization: Bearer [`access_token`]\n- UserToken: [userToken send over to `/oauth2` endpoint]\n\nThis should provide back a `TravelerProfile` response back to our system which then will be parsed to SSO the customer into our system.\n\nSwitchfly will present the customer a search form from which the customer can proceed to look for any desired products.\n\nDuring the checkout products process Switchfly will perform a request to the provided `/redeem` endpoint to send the 3rd party system the details about the booking such as points\nused and products included.\n\n## Flow Steps:\n\n- The client submits the userToken to Switchfly's `/apps/api/sso/oauth2`.\n- A token is requested from the client's `/token` endpoint.\n- A profile is requested from the client's `/traveler-profile` endpoint.\n- During checkout, a request is sent to the client's `/redeem` endpoint.\n----"
  version: v3.4
tags:
- name: OAuth 2 - SSO Authorize
  description: Switchfly OAuth 2 SSO request to 3rd party
paths:
  /token:
    post:
      tags:
      - OAuth 2 - SSO Authorize
      summary: Endpoint for authentication
      description: "This is the token endpoint that will be used either to retrieve a token exchanging the authorization `code` when `grant_type=authorization_code` is used for the SSO.\n\nOr retrieving a token using only the `client_id` and `client_secret` credentials provided by the 3rd party to Switchfly.\n\n<h4>Authorization Code</h4>\n\nWhen using the `grant_type=authorization_code` this endpoint need to return a response with both an `access_token` and `refresh_token`. \n\nThe `refresh_token` will be used to perform keep alive request using a `grant_type=refresh_token` to this same endpoint to retrieve a new set of tokens.\n\n<div style='margin:14px'>\n  <svg xmlns=\"http://www.w3.org/2000/svg\"  xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"751px\" height=\"1152px\" viewBox=\"-0.5 -0.5 751 1152\" content=\"&lt;mxfile host=&quot;app.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36&quot; version=&quot;26.1.3&quot; pages=&quot;2&quot;&gt;&#10;  &lt;diagram name=&quot;Page-1&quot; id=&quot;2YBvvXClWsGukQMizWep&quot;&gt;&#10;    &lt;mxGraphModel dx=&quot;1085&quot; dy=&quot;540&quot; grid=&quot;1&quot; gridSize=&quot;10&quot; guides=&quot;1&quot; tooltips=&quot;1&quot; connect=&quot;1&quot; arrows=&quot;1&quot; fold=&quot;1&quot; page=&quot;1&quot; pageScale=&quot;1&quot; pageWidth=&quot;850&quot; pageHeight=&quot;1100&quot; math=&quot;0&quot; shadow=&quot;0&quot;&gt;&#10;      &lt;root&gt;&#10;        &lt;mxCell id=&quot;0&quot; /&gt;&#10;        &lt;mxCell id=&quot;1&quot; parent=&quot;0&quot; /&gt;&#10;        &lt;mxCell id=&quot;aM9ryv3xv72pqoxQDRHE-1&quot; value=&quot;User&quot; style=&quot;shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;50&quot; y=&quot;30&quot; width=&quot;100&quot; height=&quot;1140&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;aM9ryv3xv72pqoxQDRHE-5&quot; value=&quot;Switchfly&quot; style=&quot;shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;270&quot; y=&quot;30&quot; width=&quot;100&quot; height=&quot;1150&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;aM9ryv3xv72pqoxQDRHE-2&quot; value=&quot;&quot; style=&quot;html=1;points=[];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;aM9ryv3xv72pqoxQDRHE-5&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;45&quot; y=&quot;80&quot; width=&quot;10&quot; height=&quot;140&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-21&quot; value=&quot;&quot; style=&quot;html=1;points=[];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;aM9ryv3xv72pqoxQDRHE-5&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;45&quot; y=&quot;710&quot; width=&quot;10&quot; height=&quot;320&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-22&quot; value=&quot;&quot; style=&quot;html=1;points=[];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;aM9ryv3xv72pqoxQDRHE-5&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;46&quot; y=&quot;1070&quot; width=&quot;10&quot; height=&quot;70&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-1&quot; value=&quot;&amp;lt;font style=&amp;quot;font-size: 11px;&amp;quot;&amp;gt;3rd party&amp;lt;br&amp;gt;Authorization service&amp;lt;/font&amp;gt;&quot; style=&quot;shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;510&quot; y=&quot;30&quot; width=&quot;100&quot; height=&quot;1150&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-3&quot; value=&quot;&quot; style=&quot;html=1;points=[];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;tG2fUWHBgCfPXQPko8Hx-1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;45&quot; y=&quot;435&quot; width=&quot;10&quot; height=&quot;110&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-3&quot; value=&quot;3rd party&amp;lt;br&amp;gt;Redemption API&quot; style=&quot;shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;700&quot; y=&quot;30&quot; width=&quot;100&quot; height=&quot;1150&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-4&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; source=&quot;aM9ryv3xv72pqoxQDRHE-1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;92.25&quot; y=&quot;130&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;310&quot; y=&quot;130&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-5&quot; value=&quot;Login request&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;145&quot; y=&quot;100&quot; width=&quot;100&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-6&quot; value=&quot;Login URL construct:&amp;lt;br&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;client_id&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;state&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;code_challenge&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;redirect_uri:Switchfly OAuth endpoint&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;amp;nbsp;&quot; style=&quot;text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;370&quot; y=&quot;150&quot; width=&quot;90&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-14&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; target=&quot;tG2fUWHBgCfPXQPko8Hx-1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;330&quot; y=&quot;249&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;564.75&quot; y=&quot;249.0000000000001&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-15&quot; value=&quot;Authorization endpoint redirect&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;360&quot; y=&quot;210&quot; width=&quot;190&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-16&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;559.5&quot; y=&quot;284.5&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;99.5&quot; y=&quot;284.5&quot; as=&quot;targetPoint&quot; /&gt;&#10;            &lt;Array as=&quot;points&quot;&gt;&#10;              &lt;mxPoint x=&quot;430&quot; y=&quot;284.5&quot; /&gt;&#10;            &lt;/Array&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-17&quot; value=&quot;Login form Authentication&quot; style=&quot;text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;160&quot; y=&quot;250&quot; width=&quot;60&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-21&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;560&quot; y=&quot;370&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;320.5&quot; y=&quot;370&quot; as=&quot;targetPoint&quot; /&gt;&#10;            &lt;Array as=&quot;points&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-22&quot; value=&quot;Authorization Code&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;375&quot; y=&quot;340&quot; width=&quot;130&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-23&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; source=&quot;aM9ryv3xv72pqoxQDRHE-5&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;322.63&quot; y=&quot;460.0000000000001&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;557.38&quot; y=&quot;480&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-24&quot; value=&quot;Authorization Code Grant RQ&amp;lt;br&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;client_id + code&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;code_verifier&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&quot; style=&quot;text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;335&quot; y=&quot;400&quot; width=&quot;180&quot; height=&quot;80&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;tG2fUWHBgCfPXQPko8Hx-27&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;552.63&quot; y=&quot;560&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;317.38&quot; y=&quot;560&quot; as=&quot;targetPoint&quot; /&gt;&#10;            &lt;Array as=&quot;points&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-4&quot; value=&quot;Validate&amp;lt;br&amp;gt;Code verifier&amp;lt;br&amp;gt;Challenge&quot; style=&quot;text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;570&quot; y=&quot;490&quot; width=&quot;90&quot; height=&quot;60&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-6&quot; value=&quot;&amp;lt;div&amp;gt;Authorization Code RS&amp;lt;/div&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;id_token&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;access_token&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;refresh_token&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&quot; style=&quot;text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;340&quot; y=&quot;475&quot; width=&quot;150&quot; height=&quot;100&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-7&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;319.5&quot; y=&quot;635&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;749.5&quot; y=&quot;635&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-8&quot; value=&quot;Traveler Profile RQ + access_token&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;325&quot; y=&quot;603&quot; width=&quot;210&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-9&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;749.5&quot; y=&quot;695&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;320&quot; y=&quot;695&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-10&quot; value=&quot;Traveler Profile RS&quot; style=&quot;text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;335&quot; y=&quot;665&quot; width=&quot;120&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-11&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;330.5&quot; y=&quot;886.9999999999998&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;750&quot; y=&quot;887&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-12&quot; value=&quot;Redemption RQ + access_token&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;330.5&quot; y=&quot;857&quot; width=&quot;200&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-13&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;749.5&quot; y=&quot;929.9999999999998&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;330.5&quot; y=&quot;929.9999999999998&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-14&quot; value=&quot;Redemption Confirmation RS&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;336.5&quot; y=&quot;900&quot; width=&quot;180&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-15&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;99.38888888888891&quot; y=&quot;888.89&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;315&quot; y=&quot;888.89&quot; as=&quot;targetPoint&quot; /&gt;&#10;            &lt;Array as=&quot;points&quot;&gt;&#10;              &lt;mxPoint x=&quot;230&quot; y=&quot;888.89&quot; /&gt;&#10;            &lt;/Array&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-16&quot; value=&quot;Checkout Redeem Product&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;130&quot; y=&quot;858.89&quot; width=&quot;170&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-17&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; source=&quot;hze9QZj4E-QPMVW4xa3l-22&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;325&quot; y=&quot;1110&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;750&quot; y=&quot;1110&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-18&quot; value=&quot;Keep Alive - Refresh token grant&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;350&quot; y=&quot;1074&quot; width=&quot;200&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-19&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; target=&quot;hze9QZj4E-QPMVW4xa3l-22&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;750&quot; y=&quot;1160&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;330&quot; y=&quot;1160&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-20&quot; value=&quot;Keep alive RS - Update Access token&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;335&quot; y=&quot;1128&quot; width=&quot;220&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-23&quot; value=&quot;Refresh&amp;amp;nbsp;&amp;lt;br&amp;gt;Token&amp;amp;nbsp;&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;245&quot; y=&quot;1118&quot; width=&quot;70&quot; height=&quot;40&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-29&quot; value=&quot;1&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;115&quot; y=&quot;100&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-31&quot; value=&quot;2&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;330&quot; y=&quot;100&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-32&quot; value=&quot;3&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;330&quot; y=&quot;210&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-35&quot; value=&quot;4&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;560&quot; y=&quot;270&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-36&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;105.5&quot; y=&quot;324.5&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;560&quot; y=&quot;324.5&quot; as=&quot;targetPoint&quot; /&gt;&#10;            &lt;Array as=&quot;points&quot;&gt;&#10;              &lt;mxPoint x=&quot;365.5&quot; y=&quot;324.5&quot; /&gt;&#10;            &lt;/Array&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-38&quot; value=&quot;5&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;70&quot; y=&quot;310&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-39&quot; value=&quot;Authentication&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;145&quot; y=&quot;300&quot; width=&quot;100&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;hze9QZj4E-QPMVW4xa3l-41&quot; value=&quot;6&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;560&quot; y=&quot;350&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;h

# --- truncated at 32 KB (194 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/switchfly/refs/heads/main/openapi/switchfly-oauth-2-sso-authorize-api-openapi.yml